Schorsch: SQL Abfrage Eigenvereinigung

Guten Tag

Ich habe folgende Tabelle:

+----+---------+--------------+
| id | parent  |     wort     |
+----+---------+--------------+
| 1  |   1     |  neues Wort  |
-------------------------------
| 2  |   1     |  Baum        |
-------------------------------
| 3  |   2     |  Ast         |
-------------------------------
| 4  |   1     |  Haus        |
-------------------------------
| 5  |   4     |  Fenster     |
-------------------------------
| 6  |   1     |  Hand        |
-------------------------------
| 7  |   1     |  Meer        |
-------------------------------
| 8  |   6     |  Finger      |
-------------------------------

Als Resultat möchte ich:

2 Baum
3 Baum > Ast
4 Haus
5 Haus > Fenster
6 Hand
8 Hand > Finger
7 Meer

Was bisher geschah:

SELECT a.id,
IF(a.parent = 1,
a.wort,
CONCAT(b.wort, ' > ', a.wort)) AS blah
FROM tabelle AS a, tabelle AS b
WHERE a.id=b.parent AND
b.parent > 1
ORDER BY blah

Das gibt mir aber nur:
2 Baum
4 Haus
aus.

Warum?

Gruss
Schorsch

  1. echo $begrüßung;

    Warum?

    Bekommst du es selbst raus, wenn du das SELECT um a.*,b.* erweiterst?

    echo "$verabschiedung $name";

  2. Guten Tag

    SELECT a.id,
    IF(a.parent = 1,
    a.wort,
    CONCAT(b.wort, ' > ', a.wort)) AS blah
    FROM tabelle AS a, tabelle AS b
    WHERE a.id=b.parent AND
    b.parent > 1
    ORDER BY blah

    Hab was rausbekommen:

    SELECT b.id,
    if(b.parent=1,
    b.wort,
    CONCAT(a.wort, ' > ', b.wort)) AS blah
    FROM tabelle AS a
    LEFT JOIN tabelle AS b ON a.id=b.parent
    WHERE b.id != 1
    ORDER BY blah

    Das gibt mir schön mein gewünschtes Resultat.
    Was ich nicht ganz genau verstehe, ist, warum die gesuchten ID's über  b.id angezeigt werden.

    Warum ist das so?

    Ich hätte erwartet, dass die ID's mit a.id angezeigt werden. Ist bei
    LEFT JOIN die gejointe Tabelle quasi die Haupttabelle? Oder wie muss man sich das ganz genau vorstellen?

    Gruss
    SChorsch

  3. Hallo,

    Guten Tag

    Ich habe folgende Tabelle:

    +----+---------+--------------+
    | id | parent  |     wort     |
    +----+---------+--------------+
    | 1  |   1     |  neues Wort  |

    | 2  |   1     |  Baum        |

    | 3  |   2     |  Ast         |

    | 4  |   1     |  Haus        |

    | 5  |   4     |  Fenster     |

    | 6  |   1     |  Hand        |

    | 7  |   1     |  Meer        |

    | 8  |   6     |  Finger      |

    Als Resultat möchte ich:

    2 Baum
    3 Baum > Ast
    4 Haus
    5 Haus > Fenster
    6 Hand
    8 Hand > Finger
    7 Meer

    Was bisher geschah:

    SELECT a.id,
    IF(a.parent = 1,
    a.wort,
    CONCAT(b.wort, ' > ', a.wort)) AS blah
    FROM tabelle AS a, tabelle AS b

    bis hier scheint mir das ok. Ich empfehle dir aber eine bessere Strukturierung.

    WHERE a.id=b.parent

    Dies erscheint mir falsch, sollte eher so lauten:
    where a.parent = b.id

    AND b.parent > 1
    ORDER BY blah

    Nach der Verknüpfung der tabelle mit sich selbst über a.parent = b.id erhälst du folgendes Skalarprodukt:

    +------+-----------+--------------+------+-----------+--------------+
    | a.id | a.parent  |   a.wort     | b.id | b.parent  |   b.wort     |
    +------+-----------+--------------+------+-----------+--------------+
    |   1  |     1     |  neues Wort  |   1  |     1     |  neues Wort  |
    ---------------------------------------------------------------------
    |   2  |     1     |  Baum        |   1  |     1     |  neues Wort  |
    ---------------------------------------------------------------------
    |   3  |     2     |  Ast         |   2  |     1     |  Baum        |
    ---------------------------------------------------------------------
    |   4  |     1     |  Haus        |   1  |     1     |  neues Wort  |
    ---------------------------------------------------------------------
    |   5  |     4     |  Fenster     |   4  |     1     |  Haus        |
    ---------------------------------------------------------------------
    |   6  |     1     |  Hand        |   1  |     1     |  neues Wort  |
    ---------------------------------------------------------------------
    |   7  |     1     |  Meer        |   1  |     1     |  neues Wort  |
    ---------------------------------------------------------------------
    |   8  |     6     |  Finger      |   6  |     1     |  Hand        |
    ---------------------------------------------------------------------

    Hieraus triffst du jetzt deine Einschränkunken/Bedingungen:
    Zeige immer a.id.
    Wenn a.parent = 1, zeige a.wort, sonst zeige (b.wort > a.wort)

    hth.

    cu,
    Michael

    1. Salut

      WHERE a.id=b.parent

      Dies erscheint mir falsch, sollte eher so lauten:
      where a.parent = b.id

      Ah, ja, genau.
      Vielen Dank, hat mir echt geholfen.
      Genau dieser Fehler hat mich total verwirrt.

      Gruss
      Schorsch