MySQL: Tabellen verknüpfen und abfragen


tvtotal

Erfahrenes Mitglied
Hallo, ich habe 3 Tabellen. Alle 3 müssen abgerufen werden und bei books1 und books2 muss geprüft werden, ob das jeweilige Feld in books2 vorhanden ist. Wenn ja dann den Wert aus books2, wenn nein, wäre der Wert aus books1 zu nehmen.

Danke aus dem Schwabenländle
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Meines Wissens nicht, aber so eine Abfrage schreibt man ja in der Regel nur einmal.
btw: Wieso IFNULL und nicht COALESCE?
 

Yaslaw

n/a
Moderator
Wahrscheinlich auch nicht schneller
SQL:
select t.id,
SUBSTRING_INDEX(GROUP_CONCAT(t.v1 ORDER BY t.rank), ',', 1) as k1,
SUBSTRING_INDEX(GROUP_CONCAT(t.v2 ORDER BY t.rank), ',', 1) as k2
from
(
select t1.id, t1.v1, t1.v2, 1 as rank
from t1
union all select t2.id, t2.v1, t2.v2, 2 as rank
from t2
) t
group by t.id
 

Zvoni

Erfahrenes Mitglied
Bin mir sogar ziemlich sicher, dass es nicht schneller ist.
Pro Zeile wird Substring und Group-Concat inkl. ORDER BY aufgerufen. Zuzüglich der UNION auf beide Tabellen.
Ich habe ne "Lösung" gesehen, bei welcher eine UDF benutzt wird, welche auf das INFORMATION_SCHEMA zugreift, und quasi einen String mit den Spaltennamen zurückgibt. Bin mir aber nicht sicher, wie sich das verhält. Ob es als Spaltennamen oder als Literal interpretiert wird.
Auf der anderen Seite kann man das INFORMATION_SCHEMA nutzen, um vom Frontend aus die Spalten abzufragen, um dann im Frontend-Code die finale Abfrage zusammenzubauen.
Fazit: zu 99% eine Aufgabe für den Frontend-Code.
Will man es als gespeicherte, parametrisierte Abfrage serverseitig haben, geht mMn nur, das Monster von Abfrage einmal zu schreiben, und gut ist.
 

tvtotal

Erfahrenes Mitglied
Danke für die Hinweise. Scheinbar ist alles nicht wirklich schneller. Kann man sowas als Funktion hinterlegen? Wäre das schneller?
 

Zvoni

Erfahrenes Mitglied
Wieso als Funktion?
Schreibe auf dem Server eine stored Procedure mit einem IN-Parameter (für dein "aid='12345'") mit komplett ausformuliertem SQL, und fertig. Wie ich bereits geschrieben habe: Sowas schreibst du einmal, und gut ist.
Ein weiterer Vorteil davon ist, falls du an der Abfrage mal was verändern willst, änderst du das einmal zentral auf dem Server, und jeglicher Client-Code "erbt" die neue Version.

Der Aufruf vom Frontend ist dann ein simples "CALL MeineProzedur('12345')"