0

次のようなデータを含むテーブルがあります。

+---------+---------+
| user_id | item_id |
+---------+---------+
|     125 |     375 |
|     125 |       2 |
|     125 |      12 |
|     125 |     375 |
|     283 |       2 |
|     283 |      11 |
|     118 |     375 |
|     118 |      12 |
+---------+---------+

そして、要求されたすべてのアイテムを持つすべてのユーザーを返すクエリを作成しようとしています。この場合、要求されたアイテムは次のとおりです。

item_id IN (375, 12) 

したがって、これは結果になるはずです。

+---------+
| user_id |
+---------+
|     125 |
|     118 |
+---------+

テーブルをそれ自体に結合することを除いて、私はこれをどのように達成するのか本当にわかりません。私が考えたアイデアの1つは、それをグループ化することでした。user_id, item_idそれから、カウントを入れるかもしれませんが、それは2枚組レコードをuser_id: 125, item_id: 3752としてカウントし、user_id 125の合計カウントを3にすると、戻るなどの独自の問題があります。同じアイテムを2回持っているユーザーと、私が本当に必要としているもの、つまり、要求されたアイテムの両方を持っているユーザー。

4

1 に答える 1

1

を使用することもできますHAVING COUNT(DISTINCT item_id) = 2が、もっと明確にしたいと思います。次のアプローチでは、任意のブール論理が可能です。

SELECT   user_id
FROM     my_table
WHERE    item_id IN (375, 12)
GROUP BY user_id
HAVING   SUM(item_id = 375) AND SUM(item_id = 12)

sqlfiddleでそれを参照してください。

これはMySQLで機能します。これは、真のブール型がないためです。代わりに、比較の「ブール」結果は実際には整数です( 1trueの0場合とfalseの場合)。したがって、一致が見つからない場合はグループの合計がゼロになり、それ以外の場合はゼロ以外になります。このような用語は、次の理由で論理演算子と組み合わせることができます。 MySQLの暗黙的な型変換を「ブール」型に戻します。他のRDBMSでは、以下を使用する必要がある場合がありますCASE

HAVING   SUM(CASE WHEN item_id = 375 THEN 1 ELSE 0 END) > 0
     AND SUM(CASE WHEN item_id =  12 THEN 1 ELSE 0 END) > 0
于 2012-12-13T23:18:43.310 に答える