0

2つのテーブルがあります:

content_term
    cid | tid
    1 | 1
    1 | 2
    1 | 3
    2 | 4
    2 | 5
    2 | 6

term_group
    tid | gid
    1 | 1
    2 | 2
    3 | 3
    4 | 1
    5 | 2
    6 | 3

「tid」を通じて特定の「gid」にリンクされていない「cid」を選択するにはどうすればよいですか?

UPD 私はcidによるグループ化でエイドリアンの方法を試しました:

SELECT cid 
FROM   content_term ct 
WHERE  NOT EXISTS (SELECT tid 
               FROM   term_group tg 
               WHERE  tg.tid = ct.tid 
                      AND tg.gid = 4) GROUP BY cid;

また、cidによるグループ化でエイドリアンの方法を試しました:

SELECT cid FROM content_term
    LEFT JOIN term_group ON (content_term.tid = term_group.tid AND gid = 4)
    WHERE gid IS NULL GROUP BY cid;

「gid」=3またはその他の値の場合、両方とも次を返します。

cid
1
2
4

2 に答える 2

0
SELECT cid 
FROM   content_term ct 
WHERE  NOT EXISTS (SELECT tid 
                   FROM   term_group tg 
                   WHERE  tg.tid = ct.tid 
                          AND tg.gid = 4) 
于 2012-08-24T14:43:23.330 に答える
0

これ:

SELECT DISTINCT cid FROM content_term
    JOIN term_group ON (content_term.tid = term_group.tid AND gid = 4);

すべてのCIDをgid4にマップします。このリストcontent_termないすべてのCIDが必要になります。したがってLEFT JOIN、一意のcidと取得したばかりの添付のcidの間を使用します。

SELECT unique_cids.cid FROM ( SELECT DISTINCT cid FROM content_term ) AS unique_cids
    LEFT JOIN ( SELECT DISTINCT cid FROM content_term
       JOIN term_group ON (content_term.tid = term_group.tid AND gid = 4) )
           AS attached_cids ON (unique_cids.cid = attached_cids.cid)
    WHERE attached_cids.cid IS NULL;

テスト:

CREATE TABLE content_term ( cid integer, tid integer );
CREATE TABLE term_group ( tid integer, gid integer );
INSERT INTO content_term VALUES (1,1),(1,2),(1,3),(2,4),(2,5),(2,6);
INSERT INTO term_group VALUES (1,1),(2,2),(3,3),(4,1),(5,2),(6,3);

最初にgid4で試してください。

SELECT unique_cids.cid FROM ( SELECT DISTINCT cid FROM content_term )
   AS unique_cids
LEFT JOIN ( SELECT DISTINCT cid FROM content_term        
JOIN term_group ON (content_term.tid = term_group.tid AND gid = 4)) 
          AS attached_cids ON (unique_cids.cid = attached_cids.cid)
     WHERE attached_cids.cid IS NULL;

+------+
| cid  |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

gid3で再試行します。

SELECT unique_cids.cid FROM ( SELECT DISTINCT cid FROM content_term ) 
    AS unique_cids
     LEFT JOIN ( SELECT DISTINCT cid FROM content_term
        JOIN term_group ON (content_term.tid = term_group.tid AND gid = 3))
            AS attached_cids ON (unique_cids.cid = attached_cids.cid)
     WHERE attached_cids.cid IS NULL;

Empty set (0.00 sec)
于 2012-08-24T14:51:34.050 に答える