2012-08-05 78 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