2015-01-27 16 views
18

Ich habe eine Abfrage, die mehrere Zeilen zurückgibt, und eine andere Abfrage, in der ich Kriterien aus einer dieser Werte sein möchte, so grundlegend möchte ich die Unterabfrage zu etwa so aussehen:Lösung für "Unterabfrage gibt mehr als 1 Zeile" Fehler

select * 
from table 
where id= (multiple row query); 

Wo multiple row query mehrere Zeilen zurückgibt. Wenn also die Werte aus diesen Zeilen 1,2,3 sind, möchte ich ID auf 1 oder 2 oder 3 setzen.

+0

Verwenden Sie Group Concat: http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field – Yossi

Antwort

53

Sie können = verwenden, wenn die Unterabfrage nur 1 Wert zurückgibt.

Wenn Subquery mehr als 1 Wert zurückgibt, werden Sie verwenden müssen IN:

select * 
from table 
where id IN (multiple row query); 

Zum Beispiel:

SELECT * 
FROM Students 
WHERE Marks = (SELECT MAX(Marks) FROM Students) --Subquery returns only 1 value 

SELECT * 
FROM Students 
WHERE Marks IN 
     (SELECT Marks 
     FROM Students 
     ORDER BY Marks DESC 
     LIMIT 10)      --Subquery returns 10 values 
+0

Für dieses Beispiel stellen Sie sicher, dass Ihre "mehrere Zeile Abfrage" zurückgibt nur eine Spalte. Etwas wie SELECT ID FROM FOO funktioniert, während SELECT ID, NAME FROM FOO oder SELECT * FROM FOO nicht funktionieren. –

+0

@SteveSaporta: Sie haben Recht !! Ich habe einige Beispiele hinzugefügt, um es besser zu verstehen. –

6

Sie in() verwenden können:

select * 
from table 
where id in (multiple row query) 

oder Verwendung eine Verbindung:

select distinct t.* 
from source_of_id_table s 
join table t on t.id = s.t_id 
where <conditions for source_of_id_table> 

Der Join ist nie eine schlechtere Wahl für die Leistung, und abhängig von der genauen Situation und der Datenbank, die Sie verwenden, kann viel bessere Leistung geben.

Verwandte Themen