2009-08-10 13 views
4

über einen Tisch Denken Sie wie dieseFinding ID mit all Wert (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 

Das Problem ist, wenn ich Werte geben 2 und 5 soll ich 102 und 105 erhalten, die sowohl 102 und 105 ist mit Werte 2 und 5 gleichzeitig oder wenn ich Werte 1 und 3 gebe, sollte ich 100 und 104 bekommen.

Wie kann ich das mit nur einem SQL-Befehl tun? Ich brauche eine Abfrage so leicht wie möglich.

und mit UNION, INTERSECTION oder NESTED SQL, welche ist schneller, langsamer, schwerer e.t.c?

Vielen Dank im Voraus Ergec

+0

Danke Leute, ich begann, Abfragen zu testen, um den schnellsten und den leichtesten zu finden. Es scheint, dass Rufusus die schnellste Abfrage ist. 20.000 Datensätze, 1006 Ergebnisse Jhonny Durchschnitt 0,0045 Sekunden David durchschnittlich 0,0020 Sekunden Rufin durchschnittlich 0,0010 Sekunden (ich würde nie denken, auf diese Weise zu tun :)) Ich bin offen für neue Vorschläge – Ergec

+0

Selbst schwere Antwort Rufinus' ist Am schnellsten würde ich Davids Antwort wählen. Es ist schnell genug und flexibel, so kann ich Werte mit ANDs und ORs gruppieren – Ergec

Antwort

0

Es gibt viele Lösungen. Neben der Lösung des Jhonny, können Sie einen Join

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

verwenden oder verwenden Sie Intersect

SELECT id FROM table WHERE value = 2 

INTERSECT 

SELECT id FROM table WHERE value = 5 
0

Dies wäre mein Weg, es zu erreichen:

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

Probieren Sie etwas wie folgt aus:

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

Wenn Sie möchten, um es zu testen, einfache Tabelle für es (ohne Indizes!):

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); 

Ich hatte vor ein paar Tagen eine sehr ähnliche Frage. Siehe MySQL - Find rows matching all rows from joined table

+0

wow, erstaunlich, ich würde nie denken, auf diese Weise zu tun :) – Ergec

+0

Ultimate Lösung !!! – Brij