2010-11-26 77 views
0

我有这样一个时刻,当某事似乎很简单,但我似乎无法找到正确的查询。我正在寻找一个查询来检查某个多对多关系是否已经存在。考虑下表:查询以检查是否存在多对多关系

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

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

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

在上表中,此提要不存在。

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

  1. 确保coll_id是IN(1,2)
  2. 确保一个COUNT(*)WHERE FEED_ID = 1将返回2(coll_id的数量)

步骤2中有什么问题是我的子查询中没有可用的feed_id的值。

还是我完全在错误的轨道上?

任何帮助将不胜感激!

回答

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

帕特里克

0

我没有测试此查询,我认为你有两列的唯一密钥:

SELECT feed_id 
FROM t 
WHERE feed_id = 1 AND coll_id IN (1,2) 
GROUP BY feed_id 
HAVING COUNT(coll_id) = 2 
+0

这样做的问题是,我不知道FEED_ID。我用IN(1,2)查询这个表,并且它应该返回0行,因为我正在寻找一个feed,其中'coll_id'为1和2.不应该返回Feed_id 1,因为它也有coll_id = 3。如果我使用IN(1,2,3)执行相同的查询,那么它应该返回feed_id 1. – wkjagt 2010-11-26 04:23:24

+0

等待,您是否需要_all_只有coll 1和2的`feed_id`的列表? – cambraca 2010-11-26 04:25:14