2012-08-05 85 views
1

我的表:MySQL的一個一對多:選擇只有一個關係存在

CREATE TABLE `binary` (
    `binaryid` int(15) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`binaryid`) 
); 

CREATE TABLE `binarycollection` (
    `binaryid` int(10) unsigned NOT NULL, 
    `collectionid` int(10) unsigned NOT NULL, 
    UNIQUE KEY `collectionid` (`collectionid`,`binaryid`), 
    KEY `binaryid` (`binaryid`) 
); 

在二進制表只能有一個存在記錄到binaryid。 binarycollection表將二進制文件關聯到多個集合。

我需要做的是做一個查詢,它將選擇二進制中的所有行,在binarycollection中有正好1個關係。

所以給出的例子:

binary: 
1 
2 
3 
4 
5 
6 
7 

binarycollection: 
(binaryid collectionid) 
1 1 
2 1 
3 1 
3 2 
4 1 
4 2 
5 2 
6 2 

它應該返回binaryids 1,2,5,和6

任何幫助理解。 :)

ps。這需要高效,表中包含數百萬行。

回答

1

使用GROUP BY

Select binaryid from binarycollection group by binaryid having count(*)=1 
+0

@Turnkey @JérômeBoé如果我添加另一個約束,那麼我想將它限制爲一組collectionid。 'SELECT binaryid FROM binarycollection WHERE collectionid IN(SELECT collectionid FROM清理) GROUP BY binaryid HAVING COUNT(*)= 1' 它將失敗。 – Tesco 2012-08-05 13:28:11

+0

您可以使用ng_cleanup表進行JOIN並添加子句Where。 – 2012-08-05 13:32:19

+0

'選擇binaryid FROM binarycollection LEFT JOIN清理 使用(collectionid) WHERE cleanup.collectionid IS NOT NULL GROUP BY binaryid HAVING COUNT(*)= 1' 仍然沒有工作。 它可能首先通過collectionid進行過濾,因此查詢的其餘部分僅在每個二進制行中看到單個二進制收集行。 – Tesco 2012-08-05 13:43:08

1

應該制定出一個簡單的查詢,因爲你的引用完整性不允許重複對在binarycollection表:

SELECT binaryid 
FROM binarycollection 
GROUP BY binaryid 
HAVING (COUNT(binaryid) = 1) 
0

與原binaryjoin它表檢查有效參考groupbinaryID

SELECT a.binaryid 
FROM `binary` a 
      INNER JOIN `binarycollection` b 
       on a.binaryid = b.binaryid 
GROUP BY a.binaryid 
HAVING COUNT(a.binaryid) = 1