2016-08-06 15 views
0
SELECT * 
FROM a 
WHERE a.re_id = 3443499 
AND a.id IN 
(
    SELECT b.rsp_id FROM b 
    WHERE b.f_id = 9 
    GROUP BY b.rsp_id 
    HAVING FIND_IN_SET(16, GROUP_CONCAT(b.o_id)) > 0 
    AND FIND_IN_SET(15, GROUP_CONCAT(b.o_id)) > 0 

    UNION 

    SELECT b.rsp_id FROM b 
    WHERE b.f_id = 4 
    GROUP BY b.rsp_id 
    HAVING FIND_IN_SET(5, GROUP_CONCAT(b.o_id)) > 0 
) 
ORDER BY id DESC 

Hier ist "f_id" ein Array und seine Werte sind diejenigen im ersten Parameter der Funktion "FIND_IN_SET". Zum BeispielGibt es eine bessere Möglichkeit, diese Abfrage auszuführen?

9=>(
16, 
15 
), 
4=>(
5 
) 

Beispieldaten für die 2 folumns in Tabelle b, F_ID 2 Spalten und O_ID

f_id o_id 
9 15 
9 18 
9 23 
4 5 
3 8 
+0

Ich meine es ist eine Benutzereingabe als Array von Formular-Checkboxen eingegeben. –

+0

Ja, in Tabelle b –

+0

Der Frage wurde jetzt mehr Text hinzugefügt. –

Antwort

0

Der Kern dieser Antwort ist, dass die aktuelle Abfrage nicht ausgeführt. Also, repariere die Syntax und frage eine andere Frage.

Zuerst könnten Sie die Abfrage so schreiben, dass sie syntaktisch korrekt ist. Die Abfrage wird wie beschrieben fehlschlagen, da die erste Unterabfrage mindestens zwei Zeilen und die zweite nur eine Zeile zurückgibt.

Zweitens, verwenden Sie UNION ALL anstelle von UNION, es sei denn, Sie möchten speziell den Mehraufwand zum Entfernen von Duplikaten.

Drittens wird die ORDER BY einen Fehler erzeugen.

Viertens ist die GROUP_CONCAT() gefährlich und unnötig.

Ich bin nicht 100% sicher, dass dies die Absicht ist, aber ich würde mit einer Abfrage wie folgt beginnen:

SELECT a.id, a.re_id 
FROM a 
WHERE a.re_id = 3443499 AND 
     a.id IN (SELECT b.rsp_id 
       FROM b 
       WHERE b.f_id = 9 
       GROUP BY b.rsp_id 
       HAVING MAX(b.o_id = 16) > 0 AND 
         MAX(b.o_id = 15) > 0 
      ) 
UNION ALL 
SELECT b.rsp_id, NULL 
FROM b 
WHERE b.f_id = 4 
GROUP BY b.rsp_id 
HAVING MAX(b.o_id = 5) > 0 
ORDER BY id; 

Dann, wenn Sie diese optimiert wollen, würde ich andere Frage vorschlagen zu fragen, zusammen mit relevanten Informationen über die Tabellenstrukturen und aktuelle Leistung.

+0

O Ja, diese Bestellung wurde nur mit der ID, nicht mit der ID "a" gesendet. Beim Verfassen dieser Frage hinzugefügt. Aber der Zweck der Vereinigung/alles war, diese rsp_id zu bekommen, und in deiner Antwort ist die Vereinigung völlig anders? –

Verwandte Themen