2011-11-22 44 views
0

我遇到问题。Mysql - 选择必须包含全部

100桶。 7种类型的球,并且允许每个桶中包括7个球(每个桶中最多只有一个类型)。

我想提取所有至少具有给定数组中球类型的bucketid(例如:1,3,6)。

MYSQL: bucketid, ballid - with (bucketid,ballid) as unique. 

SELECT bucketid FROM table WHERE ballid IN (1,3,6) 

但这返回不正确的结果...

我该怎么办呢?

如果这是不可能的,是否有更好的表格结构,我应该使用?

+0

的组合[GROUP_CONCAT()](HTTP ://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat)和[FIND_IN_SET()](http://dev.mysql.com/doc/refman/ 5.0/en/string-functions.html#function_find-in-set)应该可以做到。 – str

+0

你的查询应该会给你你需要的结果。如果没有,你能否向我们提供表格结构和一些数据? – Nonym

+0

查询返回bucketid的包括那些只有一个ballid或ballid的子集的那些。我希望它是一个绝对的条件,像bucketid必须有所有ballid列在它... – David19801

回答

0

尝试此查询 -

SELECT bucketid FROM bucket 
GROUP BY bucketid 
HAVING 
    COUNT(IF(ballid = 1, 1, NULL)) AND 
    COUNT(IF(ballid = 3, 1, NULL)) AND 
    COUNT(IF(ballid = 6, 1, NULL)); 
+0

这是一个密集的查询?有没有更好的表格结构,我应该用它来代替? – David19801

+0

如果此表格表示多对多关系(当一个bucketid可能有多个ballid,一个ballid可能有许多bucketid),那么结构是正确的。否则,请在Internet上查找有关数据库规范化的更多信息。 – Devart

0

具有一搏与此设立(或假设):

我创建了一个balls表的假设下,为了让您知道什么球ID值你需要过滤,他们必须来自某个地方..而我的列maybeballname仅仅是为了给它(有一个balls表)稍微多一点的意义,像球ID是什么意思?所以我给它起了一个名字作为例子。只是一个例子。

-- balls should have its own table 
CREATE TABLE balls (
    ballid INT 
    , maybeballname VARCHAR(10) 
); 
-- sample buckets 
CREATE TABLE buckets (
    bucketid INT 
    , ballid INT 
); 

--populate with data 
INSERT INTO balls VALUES(1,'BALL#1'); 
INSERT INTO balls VALUES(2,'BALL#2'); 
INSERT INTO balls VALUES(3,'BALL#3'); 
INSERT INTO balls VALUES(4,'BALL#4'); 
INSERT INTO balls VALUES(5,'BALL#5'); 
INSERT INTO balls VALUES(6,'BALL#6'); 
INSERT INTO balls VALUES(7,'BALL#7'); 
INSERT INTO balls VALUES(8,'BALL#8'); 
INSERT INTO balls VALUES(9,'BALL#9'); 
INSERT INTO buckets VALUES(1,1);--complete (1,3,6) 
INSERT INTO buckets VALUES(1,3); 
INSERT INTO buckets VALUES(1,6); 
INSERT INTO buckets VALUES(1,2); 
INSERT INTO buckets VALUES(1,4); 
INSERT INTO buckets VALUES(2,5); 
INSERT INTO buckets VALUES(2,2); 
INSERT INTO buckets VALUES(3,1); 
INSERT INTO buckets VALUES(4,1);--complete (1,3,6) 
INSERT INTO buckets VALUES(4,3); 
INSERT INTO buckets VALUES(4,6); 
INSERT INTO buckets VALUES(5,3); 

-- this should return bucket id values 1 and 4, right? 
SELECT bk.bucketid 
FROM buckets AS bk 
INNER JOIN balls AS b ON bk.ballid = b.ballid 
WHERE b.ballid 
IN (1, 3, 6) 
GROUP BY bk.bucketid 
HAVING COUNT(bk.bucketid) >= 3 -- at least the number of ball ids provided 
-- and bucket id 1 has ballid values 1-6 
+0

桶可以容纳多达7个球,所以你可以有一个与1,3,6,2,7例如...我想使用素数和存储多个... – David19801

+0

坚持..所以什么确切地说,你是否会选择要返回的球体值? – Nonym

+0

核心条件是:bucketid的返回必须包含AT至少所有球的给定... – David19801

0

这是一个有点迂回的,因为MySQL只支持ALL on sub-queries,但你应该能够得到你想要的东西与喜欢的查询:

SELECT * 
FROM table 
WHERE bucketid = ALL (
    SELECT bucketid 
    FROM table 
    WHERE ballid IN (... your list of ballid's ...) 
)