当事情看起来如此简单但我似乎无法找到正确的查询时,我有其中一个时刻。我正在寻找一个查询,检查是否已存在某种多对多关系。请考虑下表:
+---------+---------+ | feed_id | coll_id | +---------+---------+ | 1 | 1 | | 1 | 2 | | 1 | 3 | +---------+---------+
这是表'feed'和表'collections'之间多对多关系的表。
我需要一个查询,检查是否已存在包含集合1和2的Feed,并且只有1和2.如果有,我需要它的feed_id。
在上表中,此Feed不存在。
查询的更一般描述是:查找包含所有coll_id的供稿,并且供稿不包含任何其他集合。对于上面的示例,这将意味着以下内容:
第2步中的问题是我的子查询中没有feed_id的值。
或者我完全走错了路?
非常感谢任何帮助!
答案 0 :(得分:1)
我认为这将回答所有情况:
SELECT coll_id, feed_id
FROM a a1
GROUP BY coll_id
HAVING feed_id IN (2,4)
AND COUNT(*) = 2
AND NOT EXISTS (
SELECT *
FROM a a2
WHERE a2.coll_id = a1.coll_id
AND feed_id NOT IN (2,4)
)
我使用这些数据进行了测试:
+---------+---------+
| feed_id | coll_id |
+---------+---------+
| 1 | 1 |
| 2 | 4 |
| 2 | 7 |
| 3 | 3 |
| 4 | 2 |
| 4 | 4 |
| 5 | 4 |
| 6 | 1 |
| 6 | 2 |
| 6 | 4 |
| 7 | 2 |
| 7 | 4 |
+---------+---------+
只有coll_id 4和7只有2和4作为feed_id
我也用feed_id(1,2,4)返回6进行测试,feed_id(3)返回3
帕特里克
答案 1 :(得分:0)
我没有测试这个查询,我假设你在两列都有一个UNIQUE键:
SELECT feed_id
FROM t
WHERE feed_id = 1 AND coll_id IN (1,2)
GROUP BY feed_id
HAVING COUNT(coll_id) = 2