2010-11-26 78 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