Mysql, Join oder nicht Join
guest
- datenbank
1 EKKi0 Alexander, W.0 guest0 Vinzenz Mai0 Ilja
0 guest
Vorab einen schönen guten Tag. Noch schöner könnte er für mich werden wenn ich mal dieses "kleine Problemchen" lösen würde. Irgendwie finde ich keine "schicke" Lösung.
Folgendes ist vorhanden (vereinfachte Darstellung) :
+-----+
|t1 |
+-----+
|id |
|text1| +-----+
|id_t2|--|t2 |
+-----+ +-----+
|id |
|text2|
|id_t3|-------------+
|id_t3|----+ |
+-----+ | |
+-----+ +-----+
|t3 | |t3 |
+-----+ +-----+
|id | |id |
|text3| |text3|
+-----+ +-----+
SELECT t1.text
t2.text2
t3.text3
FROM t1
INNER JOIN t2 ON (t1.id_t2 = t2.id)
INNER JOIN t3 ON (t2.id_t3 = t3.id)
WHERE t1.id = $suchindex
Mit obiger Anweisung erhalte ich im array = text, text2, text3.
Soweit, so gut, doch ich würde gern array = text, text2, text3, text3 erhalten.
In t2 sind natürlich die Inhalte von id_t3 unterschiedlich, sonst macht das ja keinen Sinn. ;-)
Vielleicht reicht ein Denkanstoss, ich befürchte allerdings ich muss eine zweite Anfrage stellen oder die Tabelle t3 klonen in t4.
Die Tabelle t3 ist für Namensgebung gedacht und nicht sonderlich lang, dennoch wäre es mit einer weiteren Anfrage oder geklonter Tabelle nicht wirklich "schick".
Mahlzeit guest,
Mit obiger Anweisung erhalte ich im array = text, text2, text3.
Soweit, so gut, doch ich würde gern array = text, text2, text3, text3 erhalten.
Nutze Aliase ... sowohl für die Tabelle(n) als auch für Felder, die mehrfach vorkommen:
SELECT t1.text
, t2.text2
, t3_1.text3 AS text3_1
, t3_2.text3 AS text3_2
FROM t1
INNER JOIN t2 ON (t1.id_t2 = t2.id)
INNER JOIN t3 AS t3_1 ON (t2.id_t3 = t3_1.id)
INNER JOIN t3 AS t3_2 ON (t2.id_t3 = t3_2.id)
WHERE t1.id = $suchindex
MfG,
EKKi
Hall Guest,
mit Unterabfragen dürfte das noch schneller gehen als mit JOIN, falls du entsprechend hohe Version von MySQL hast.
Bsp.
SELECT t1.text,
(SELECT FROM t2 WHERE t1.id_t2 = t2.id) AS text2,
(SELECT FROM t3 WHERE t2.id_t3 = t3.id) AS text3_1,
(SELECT FROM t3 WHERE t2.id_t3 = t3.id) AS text3_2,
FROM t1
WHERE t1.id = $suchindex
Unterabfragen werden von MySQL ab 5 (soweit erinnere) bevorzugt.
Gruß Alexander.
Moin Alexander,
danke für den Hinweis.
Gegen Geschwindigkeit habe ich nichts einzuwenden. ;-)
Werde ich austesten und mal schauen wie der Vergleich ausgeht.
Im Übrigen benutze ich => 5.0.51a-24+lenny1
MfG
Hallo Alexander,
mit Unterabfragen dürfte das noch schneller gehen als mit JOIN, falls du entsprechend hohe Version von MySQL hast.
Subselects sind nicht generell schneller als Joins. Ob es etwas bringt, zeigen entsprechende EXPLAIN-Abfragen gegen die Originaldaten.
Freundliche Grüße
Vinzenz
...
Subselects sind nicht generell schneller als Joins. Ob es etwas bringt, zeigen entsprechende EXPLAIN-Abfragen gegen die Originaldaten.
... gut ergänzt, Vinzenz. Danke.
Gruss Alexander.
yo,
mit Unterabfragen dürfte das noch schneller gehen als mit JOIN, falls du entsprechend hohe Version von MySQL hast.
man kann nicht einfach immer joins mit unterabfragen ablösen. erstens muss sichergestellt werden, dass die unterabfragen nur ein feld zurück liefert, was ich mal bezweifel. aber selbst wenn, woher kennen
sich den die tabellen in den unterabfragen gegenseitig, so dass du die id aus t2 in der unterabfrage mit der tabelle t3 benutzen kannst ?
Ilja
Moin EKKi,
vorab vielen Dank für die schnelle und vor allem hilfreiche Information.
Konnte so das "kleine Problemchen" lösen.
Den Hinweis auf die Bäume und den Wald vor Augen erspare ich mir.
MfG