0

重複の可能性:
SQL の結果をフィルター処理して has-many-through 関係にする方法

特別な JOIN 要件を持つ Android アプリの SQL ステートメントに取り組んでいます。PERSON 用と INTEREST 用の 2 つのテーブルがあります。PERSON は複数の INTERESTS を持つ場合があります。

指定されたすべての興味を持っている人だけを返すクエリを探しています。ここに私のサンプルテーブルがあります:

PERSON
_id | name
1   | Bob
2   | Harry
3   | Lucy
4   | Sally

INTERESTS
_id | person | interest
1   | bob    | skiing
2   | bob    | biking
3   | bob    | swimming
4   | harry  | skiing
5   | harry  | surfing
6   | harry  | swimming

クエリで、スキーとサイクリングの両方が好きな人 (ボブのみ) をすべて検索します。また、可能であれば、bob のレコードを 1 回だけ返すこともできます。SQLite はそのようなクエリを実行できますか? もしそうなら、どのように?

よろしくお願いします!

4

3 に答える 3

0

多分これ:

SELECT p.name FROM person p JOIN Interests i on p.name = i.person GROUP BY p.name HAVING count(*)= 2 WHERE i.interest in('skiing'、'biking')。

また、名前ではなく、インタレストテーブルで個人IDを使用する方がよいことに同意します。別の提案:インタレストIDを持つ個別のテーブルが必要であり、テーブルの個人インタレストには2つのIDしかありません。

于 2013-01-26T06:33:11.263 に答える
0

他のソリューションとは別に、Exists()オペレーターを使用すると、このタイプのリクエストを簡単に行うことができます。たとえば、次のようになります。

SELECT p.* FROM person p Where Exists (Select * from interests i where i.person = p.name and i.interest = 'skiing') and Exists (Select * from interests i where i.person = p.name and i.interest = 'biking')

また、の代わりに、テーブルの を外部キーとして_idテーブルに格納する必要があります。このようにして、他の関連テーブルの値を変更することなく、同じ名前の複数の人物を配置したり、後で個人の名前を変更したりできます。personinterestsname

interestsテーブルの名前に複数形を使用し、テーブルの名前に単数形を使用することもお勧めできませんperson

于 2013-01-26T08:44:53.703 に答える
0

私は通常、テーブルを複数回 JOIN しますが、検索基準がわからない場合、これは難しい場合があります。つまり、2 つの異なる興味で検索している場合、興味テーブルに 2 回参加することになります。

上記の質問では、次のようなものが機能します。

select distinct p.name
from person p
    join interests i on p.name = i.person and i.interest = 'skiing'
    join interests i2 on p.name = i2.person and i2.interest = 'biking'

これにより、Bob が返されます。

補足として、名前ではなく、興味のあるテーブルに個人 ID を保存する必要があります。そして、PersonId と InterestId を使用して PersonInterests テーブルを導入することを検討してください。これは、正規化にさらに適しています。

幸運を。

于 2013-01-26T01:14:04.687 に答える