1

さまざまなおもちゃとそれらが使用する電池の種類をリストした表があるとしましょう。

toy_id   battery_id    battery_qty
     1            3              1
     2            2              4
     2            3              1
     3            1              1

どのおもちゃがバッテリータイプ2と3の両方を使用するかを教えてくれるクエリを作成したいと思います(ただし、他のおもちゃも使用する可能性があります)。上記の例では、それはtoy_id2です。

そのようなクエリを作成するにはどうすればよいですか?

これが私がこれまでに持っているものですが、それは厄介なようです:

SELECT t1.toy_id,
    t1.battery_id b1, t2.battery_id b2,
    t1.battery_qty qty1, t2.battery_qty qty2
FROM toys t1
LEFT JOIN toys t2
    ON t1.toy_id = t2.toy_id
WHERE t1.battery_id = 2
    AND t2.battery_id = 3
HAVING q1 > 0
    AND q2 > 0
ORDER BY toy_id ASC;

結果は正しいように見えますが、何かを逃したかどうか知りたいです。

4

2 に答える 2

3

ここでは join はあまり必要ないと思います。レコードのインスタンス数を数えるだけでよく、これは検索した条件の数と同じです。

SELECT  toy_ID
FROM    toys
WHERE   battery_ID IN (2,3)
GROUP BY toy_ID
HAVING COUNT(*) = 2

ただし、toy_id ごとに battery_id に一意の制約が定義されていない場合は、句DISTINCTに必要です。HAVING

SELECT  toy_ID
FROM    toys
WHERE   battery_ID IN (2,3)
GROUP BY toy_ID
HAVING COUNT(DISTINCT battery_ID) = 2
于 2012-11-29T01:58:53.167 に答える
1

fulljoin なしで使用できると思いますqty(テーブルで battery_qty が常に > 0 であると仮定):

  SELECT distinct t1.toy_id
  FROM toys t1
  JOIN toys t2
  ON t1.toy_id = t2.toy_id
  WHERE t1.battery_id = 2
    AND t2.battery_id = 3
  ORDER BY toy_id ASC;
于 2012-11-29T01:58:18.900 に答える