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 のみが返されます

ありがとう

4

7 に答える 7

3

これには結合を使用できます。

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
于 2009-03-27T16:51:18.680 に答える
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

于 2009-03-27T17:03:12.770 に答える
1

サブクエリとグループを使用してこれを行うことができます。検索する必要がある値の数を知っていると仮定すると、次のことができます。

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") 値の総数に等しくなります。

于 2009-03-27T16:58:46.120 に答える
0

UNION句を使用することを考えましたか?

SELECT ID FROM MyTable WHERE cond = 2 UNION SELECT ID FROM MyTable WHERE cond = 6

探している正確な出力を指定できれば、それも役立ちます。しかし、私が理解したことから、UNIONは行く方法になるでしょう。

于 2009-03-27T17:13:50.700 に答える
0
SELECT DISTINCT(ID) WHERE (cond = 2) OR (cond = 6)
于 2009-03-27T16:52:04.013 に答える
0

これが何をしているかについてもう少し透過的である別の構文を次に示します (ただし、パフォーマンスはそれほど高くありません)。

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)
于 2009-03-27T16:56:09.557 に答える
0

ID ごとに重複がない場合、これはもう少し柔軟になる可能性があります。

SELECT id
FROM tbl 
GROUP BY id
HAVING SUM(CASE cond 
    WHEN 2 THEN 1
    WHEN 6 THEN 1
    ELSE 0 END) > 1
于 2009-03-27T17:03:08.277 に答える