2011-08-07 1 views
0

私は、値の完全なデータベースと、起源のある列(特定の項目の出所)を持っています。私は、データベースに記載されているすべての起源についてスピナーを作成しようとしていますが、明らかにそれらを1回繰り返すだけです。私は、SQL文で使用しようとしています:Android SQLite:SQLクエリーでNo Duplicatesを選択します。

String sql = "SELECT _id, origin FROM items GROUP BY origins"; 

をしかし、私はまた、スピナーを投入するためにカスタムSimpleCursorAdapterを使用していますが、そのせいで私も_id列を照会する必要があります。 _id列をクエリに追加すると、idによって重複する行がないため、すべての繰り返し起点を含むクエリが生成されます。両方の列を渡すには何が必要ですか?重複は削除しますか?アルファベット順で整理できることも素晴らしいでしょう!

SELECT origin, MAX(_id) FROM items GROUP BY origin ORDER BY origin 

答えて

2

すべての原点値は、いくつかに「所属」することができますので、あなたは、重複した原点の値を持つビューを取得:あなたがアルファベット順にそれらをしたい場合はちょうどこのように変更し、Preliの答えに追加するには

+0

私の状況では、カスタムsimplecursoradapterが_id列全体を必要とし、例外がスローされるため、これは機能しません。 – ryandlf

+0

simplecursoradapterについては分かりませんが、おそらくdifferesという名前は "max(_id)" - > "max(_id)as _id"の代わりに試してみると混乱している可能性があります。 – Preli

0

ids。

私は次のように「クリーン」解決することはないと思うが、それはそれぞれの原点値に対応する最高のIDと一緒にあなたに重複値を与えない:

Select origin, max(_id) from items group by origin 
2

ます。また、データベースを正規化する検討するかもしれません。テーブルで複数回起点を繰り返すのではなく、別々の起点参照テーブルを作成することができます。次に、オリジナルのテーブルで、原点を主キーで参照できます。あなたはデータのみが存在していたために起源を望んでいた場合、あなたが何か行うことができ

 
origins 
*********************** 
id  name 
----------------------- 
1  origin_1 
2  origin_2 
3  origin_3 
*********************** 

detail_data 
************************** 
id  origin_id  data 
1  1    ... 
2  1    ... 
3  3    ... 
4  3    ... 
************************** 

は次に:たとえば

SELECT DISTINCT o.* 
FROM origins AS o 
JOIN detail_data AS dd ON (dd.origin_id = o.id) 
ORDER BY o.name ASC; 

を正規化は、フットプリントが縮小などの利点を提供することができますので、私は、一般的に正規化されたデータベースを好みますサイズ、クリーンなデータ、より柔軟な構造を提供します。しかし、私は、正規化が従来のデータベースシステム(デスクトップ、サーバ)と比べてAndroidにはあまり有益ではないようだと認めます。また、正規化には、より複雑なクエリ(前述のとおり)などの欠点もあります。しかし、長期的に柔軟性、保守性、堅牢性を最大化するためには、正規化がより良い方法かもしれません。

+0

+1は正規化を提案しています。間違いなくデータベース設計の良いアプローチです。 – Pikaling

関連する問題