次のようなテーブル構造があります。
ID cond
1 5
1 2
1 6
8 2
9 1
9 5
1 つ以上の条件を含む行を選択する場合は、OR (...WHEN cond=2 OR cond=6 GROUP BY ID...) を使用します
しかし、ID でグループ化された複数の条件を同時に含む行を選択するにはどうすればよいでしょうか? たとえば、cond 2 と 6 を含む行を検索したい場合、ID 1 のみが返されます
ありがとう
次のようなテーブル構造があります。
ID cond
1 5
1 2
1 6
8 2
9 1
9 5
1 つ以上の条件を含む行を選択する場合は、OR (...WHEN cond=2 OR cond=6 GROUP BY ID...) を使用します
しかし、ID でグループ化された複数の条件を同時に含む行を選択するにはどうすればよいでしょうか? たとえば、cond 2 と 6 を含む行を検索したい場合、ID 1 のみが返されます
ありがとう
これには結合を使用できます。
SELECT ID
FROM tbl t1
INNER JOIN
tbl t2
ON t1.ID = t2.ID
WHERE t1.cond = 2
AND t2.cond = 6
または、ID/条件のペアが一意の場合:
SELECT ID
FROM tbl
WHERE cond IN (2, 6)
GROUP BY ID
HAVING COUNT(cond) = 2
これには複数の方法があります。
使用COUNT
(最速):
SELECT id FROM tbl WHERE tbl.cond IN ( 2, 6 ) HAVING COUNT(DISTINCT cond) = 2 GROUP BY id
使用EXISTS
(ネストされたループを使用、非常に大きなテーブルでは遅くなりますが、バリアントよりも暗号化が少なく、拡張性が高くなりCOUNT
ます):
SELECT DISTINCT id FROM tbl AS tbl1 WHERE EXISTS (SELECT * FROM tbl AS tbl2 WHERE tbl1.id = tbl2.id AND tbl2.cond = 2) AND EXISTS (SELECT * FROM tbl AS tbl2 WHERE tbl1.id = tbl2.id AND tbl2.cond = 6)
使用GROUP_CONCAT
(COUNT テーマの MySql 固有のバリエーションですが、正確な一致が必要な場合、たとえば cond=2 と cond=6 で他の条件がない場合は、読み取りに変更された以下SELECT id, GROUP_CONCAT(DISTINCT cond ORDER BY cond) AS conds ... WHERE conds='2,6'
が最高のパフォーマンスを発揮します)
SELECT id, ','||GROUP_CONCAT(DISTINCT cond)||',' AS conds FROM tbl WHERE INSTR(conds, ',2,') > 0 AND INSTR(conds, ',6,') > 0 GROUP BY id
サブクエリとグループを使用してこれを行うことができます。検索する必要がある値の数を知っていると仮定すると、次のことができます。
select
t.ID
from
(
select distinct
ID, cond
from
tbl
where
tbl.cond in (2, 6)
) as t
group by
t.ID
having
count(t.cond) = 2
一般的なケースでは、存在する必要がある条件のリスト (つまり "(2, 6)") を更新して新しい値を含め、having 句 (つまり "having count(t.cond)") を更新するだけです。 = 2") 値の総数に等しくなります。
UNION句を使用することを考えましたか?
SELECT ID FROM MyTable WHERE cond = 2 UNION SELECT ID FROM MyTable WHERE cond = 6
探している正確な出力を指定できれば、それも役立ちます。しかし、私が理解したことから、UNIONは行く方法になるでしょう。
SELECT DISTINCT(ID) WHERE (cond = 2) OR (cond = 6)
これが何をしているかについてもう少し透過的である別の構文を次に示します (ただし、パフォーマンスはそれほど高くありません)。
SELECT DISTINCT ID
FROM MyTable T
WHERE
EXISTS(SELECT ID FROM MyTable T1 WHERE Cond=2 AND T1.ID=T.ID) AND
EXISTS(SELECT ID From MyTable T2 WHERE Cond=6 AND T2.ID=T.ID)
ID ごとに重複がない場合、これはもう少し柔軟になる可能性があります。
SELECT id
FROM tbl
GROUP BY id
HAVING SUM(CASE cond
WHEN 2 THEN 1
WHEN 6 THEN 1
ELSE 0 END) > 1