guest: Mysql, Join oder nicht Join

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".

  1. 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

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. 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.

      1. 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

      2. 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

        1. ...

          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.

      3. 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

    2. 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