2011-11-22 60 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 ...) 
)