查询以检查是否存在多对多关系

时间:2010-11-26 02:39:08

标签: mysql

当事情看起来如此简单但我似乎无法找到正确的查询时,我有其中一个时刻。我正在寻找一个查询,检查是否已存在某种多对多关系。请考虑下表:

    +---------+---------+
    | feed_id | coll_id |
    +---------+---------+
    |       1 |       1 |
    |       1 |       2 |
    |       1 |       3 |
    +---------+---------+

这是表'feed'和表'collections'之间多对多关系的表。

我需要一个查询,检查是否已存在包含集合1和2的Feed,并且只有1和2.如果有,我需要它的feed_id。

在上表中,此Feed不存在。

查询的更一般描述是:查找包含所有coll_id的供稿,并且供稿不包含任何其他集合。对于上面的示例,这将意味着以下内容:

  1. 确保coll_id为IN(1,2)
  2. 确保COUNT(*)WHERE feed_id = 1将返回2(coll_id的数量)
  3. 第2步中的问题是我的子查询中没有feed_id的值。

    或者我完全走错了路?

    非常感谢任何帮助!

2 个答案:

答案 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