8

次の 1 対多

CREATE TABLE source(id int, name varchar(10), PRIMARY KEY(id));
CREATE TABLE params(id int, source int, value int);

ここで、params.source は source.id への外部キーです

INSERT INTO source values(1, 'yes');
INSERT INTO source values(2, 'no');

INSERT INTO params VALUES(1,1,1);
INSERT INTO params VALUES(2,1,2);
INSERT INTO params VALUES(3,1,3);

INSERT INTO params VALUES(4,2,1);
INSERT INTO params VALUES(5,2,3);
INSERT INTO params VALUES(6,2,4);

パラメータ値のリスト ([1,2,3] など) がある場合、SQL でリスト内のすべての値 (ソース 1、「はい」) を持つすべてのソースを見つけるにはどうすればよいですか?

ありがとう

4

2 に答える 2

11
SELECT s.*
FROM source AS s
 JOIN params AS p ON (p.source = s.id)
WHERE p.value IN (1,2,3)
GROUP BY s.id
HAVING COUNT(DISTINCT p.value) = 3;

params.value の重複が防止されていないため、DISTINCT が必要です。

于 2008-10-16T19:01:23.573 に答える
7

編集特定のソースの値が複数回出現する可能性がある場合を処理するように変更されました。

これを試して:

SELECT
    *
FROM
    source
WHERE
    (
        SELECT COUNT(DISTINCT value)
        FROM params
        WHERE params.source = source.id
          AND params.value IN (1, 2, 3)
    ) = 3

GROUP BY に書き換えることもできます。

SELECT
    source.*
FROM
    source
    INNER JOIN params ON params.source = source.id
WHERE
    params.value IN (1, 2, 3)
GROUP BY
    source.id,
    source.name
HAVING
    COUNT(DISTINCT params.value) = 3
于 2008-10-16T19:00:55.243 に答える