これ:
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)