2017-03-31 2 views
2

Ich versuche, eine einzige MySQL-Abfrage zu Daten innerhalb einer Drittanbieter-Funktion auswählen, das Problem habe ich aber sie nur die ID übergeben. Ich muss diese ID verwenden, um alle zugehörigen Datensätze auszuwählen.MySQL where subselect auf mehrere Felder

Derzeit ist die MySQL-Anweisung sieht wie folgt aus:

SELECT h.id, h.notification_id, h.status, d.detail 
FROM headers h, details d 
WHERE h.host_id = (SELECT host_id FROM headers WHERE id = '{$rowid}') 
AND h.service_id = (SELECT service_id FROM headers WHERE id = '{$rowid}') 
AND h.instance = (SELECT instance from headers where id = '{$rowid}') 
AND h.id = d.header_id; 

Jetzt das funktioniert, aber ich bin die schlechte MySQL-Engine denken läuft 3 Subqueries, weil ich nicht über 3 Informationen zur Verfügung zu mir .

Also fragte ich mich, ob es eine Möglichkeit gibt, dies mit einer Abfrage und einer Unterabfrage auszuführen, um die Last auf der Datenbank zu speichern?

Vielen Dank im Voraus.

+0

Fördern Sie die Verwendung von expliziten 'JOIN' sintaxis, schrieb Aaron Bertrand einen schönen Artikel [Schlechte Angewohnheiten zu treten: mit alten Stil JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/ 08/bad-Gewohnheiten-zu-kick-using-old-style-joins.aspx) darüber. –

Antwort

1

Sie können mit Tupeln arbeiten (dh anstatt auf der Suche nach oben host_id und service_id und instance Sie die Kombination aufblicken würde (host_id, service_id, instance)):

SELECT h.id, h.notification_id, h.status, d.detail 
FROM headers h 
JOIN details d ON d.header_id = h.id 
WHERE (h.host_id, h.service_id, h.instance) = 
    (SELECT host_id, service_id, instance FROM headers WHERE id = '{$rowid}') 
; 

Dies legt Kriterien wo gehört es: in der where-Klausel (genau wie in Ihrer Abfrage). Sie wählen aus Header und Details wobei die Kombination (host_id, service_id, instance) mit dem Datensatz mit der angegebenen ID übereinstimmt.

+0

Was ist schneller ein Join oder ein Tupel? – trevrobwhite

+0

Dies hängt vom Optimierer des DBMS ab. Ein guter Optimierer würde den gleichen Ausführungsplan für beide Abfragen erhalten. Ich bemühe mich, meine Abfragen so leserlich wie möglich zu halten (was oft bedeutet, nur aus den Tabellen zu wählen, aus denen ich Daten sehen möchte und '[NOT] IN' oder' [NOT] EXISTS' anstelle von Join zu verwenden. Ich ändere das nur, wenn ich wirklich Leistungsprobleme habe. Ich denke nicht, dass obige Abfrage zu Performance-Problemen führen würde, also wäre es meine Präferenz. Letztendlich läuft es oft genau darauf hinaus: persönliche Vorlieben. –

+0

Schau es dir so an: Welche Abfrage wäre für dich einfacher zu verstehen, wenn du sie in drei oder vier Jahren angeschaut hättest :-) –

3

Sie können SELF JOIN verwenden, um die mehreren Unterabfragen zu entfernen.

Versuchen Sie folgendes:

SELECT h.id, h.notification_id, h.status, d.detail 
FROM headers h 
INNER JOIN details d ON h.id = d.header_id 
INNER JOIN headers h2 ON h.host_id = h2.host_id AND h.service_id = h2.service_id AND h.instance = h2.instance 
WHERE h2.id = '{$rowid}' 
+0

schlag mich auch. 'JOIN' wird viel schneller sein. – Cfreak

+0

Vielen Dank, dass beide ein Leckerbissen gearbeitet – trevrobwhite