2009-08-10 33 views
4

想一想這樣查找ID具有所有的值(MySQL的,SQL)

ID  Value  
100 1  
100 3  
101 1  
101 4  
102 2  
102 5  
103 2  
103 4  
104 1  
104 3  
105 2  
105 5 

的問題是一個表,如果我給值2和5我應該得到102和105其中兩個102和105具有值2和5在同一時間,或者如果我給值1和3我應該得到100和104.

我怎樣才能做到這一點只有一個SQL命令?我需要儘可能輕的查詢。

並使用UNION,INTERSECTION或NESTED SQL,哪一個更快,更慢,更重e.t.c?

在此先感謝 Ergec

+0

謝謝你們,我開始測試查詢,以找到最快和最輕的一個。 看來Rufinus的查詢是最快的。 20,000條記錄,1006個結果 的Jhonny平均0.0045秒 大衛平均0.0020秒 Rufinus平均0.0010秒(我從來沒有覺得做這樣:)) 我願意接受新的建議 – Ergec 2009-08-10 14:48:59

+0

即使強硬Rufinus'答案是我選擇戴維的答案的速度最快。它的快速和靈活,所以我可以用AND和OR來分組值 – Ergec 2009-08-11 15:02:33

回答

0

有很多解決方案。除了的Jhonny的解決方案,你可以使用一個加入

SELECT DISTINCT t1.id 
FROM table t1, table t2 
WHERE t1.id = t2.id 
    AND t1.value = 2 
    AND t2.value = 5 

或使用相交

SELECT id FROM table WHERE value = 2 

INTERSECT 

SELECT id FROM table WHERE value = 5 
0

這將是我的方式來實現這一目標:

SELECT DISTINCT id 
FROM table 
WHERE 
id IN (SELECT id FROM table WHERE value = 2) 
AND 
id IN (SELECT id FROM table WHERE value = 5) 
5

嘗試是這樣的:

SELECT id 
    FROM test 
WHERE 
    value in (2,5) 
GROUP by id 
HAVING count(*) = 2 

如果你想測試它,簡單的表它(沒有索引!):

CREATE TABLE IF NOT EXISTS test (
    id int(4) NOT NULL, 
    `value` int(4) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO test (id, value) VALUES 
(100, 1), 
(100, 3), 
(101, 1), 
(101, 4), 
(102, 2), 
(102, 5), 
(103, 2), 
(103, 4), 
(104, 1), 
(104, 3), 
(105, 2), 
(105, 5); 

幾天前我有一個非常類似的問題。看到MySQL - Find rows matching all rows from joined table

+0

哇,太棒了,我從來沒有想過這樣做:) – Ergec 2009-08-10 14:44:30

+0

終極解決方案! – Brij 2012-02-23 07:46:35

相關問題