2016-07-07 13 views
0

Ich versuche, Informationen aus einer Tabelle selbst zu verbinden, um eine Hierarchie anzuzeigen (die Tabelle enthält Mitglieder, die aus Kindern und deren Eltern bestehen). Der Tabellenname ist 'Mitglieder', die vier wichtigen Spalten sind ID, vollständiger Name, vater_id und mother_id. Die IDs in den Spalten vater_id und mother_id stimmen mit den entsprechenden IDs in der Spalte 'id' überein. Als Ergebnis der Abfrage möchte ich eine Tabelle mit drei Spalten haben, mit Spaltennamen "Name", "Vater" und "Mutter"So erhalten Sie eine Dreifach-Self-Join-Funktion

Ich suchte Google, W3 Schulen und Stapelüberlauf, die am nächsten zu was ich war auf der Suche nach einem Thema war ich hier gefunden, die so genannte ‚Erklärung der Selbst verbindet‘, das den folgenden Beispielcode hatte:

select 
    c1.Name , c2.Name As Boss 
from 
    emp1 c1 
inner join emp2 c2 
    on c1.Boss_id = c2.Id 

ich die Abfrage wie folgt verändert (ich noch nicht einmal wagen, den dritten umfassen Spalte noch: ')):

select 
    c1.full_name as Name, c2.full_name as Father 
from 
    members1 c1 
inner join members2 c2 
    on c1.father_id = c2.id 

Leider habe ich eine Fehlermeldung erhalten Folgendes: 1146 - Tabelle 'ppstb.members1' existiert nicht

Ich vermutete, dass es etwas damit zu tun hatte, wie ich zwei Tabellen simuliert habe. Das nächste, was ich experimentierte mit ist:

select 
    c1.full_name , c2.full_name as Father 
from 
    members c1, members c2 
inner join members c2 
    on c1.father_id = c2.id 

Aber das gibt auch einen Fehler: 1066 - Nicht eindeutige Tabelle/Alias: ‚c2‘ Welchen Schritt bin ich dabei?

+0

Für # 1146 Fehler: Tabelle Namen sind Groß-und Kleinschreibung. Verwenden Sie den richtigen Fall? – Arulkumar

+0

@Arulkumar nach seinen Abfragen sein Tabellenname ist Mitglieder, aber er verwendet seinen Namen als members1 in dieser Abfrage, die das Problem ist –

Antwort

0

letzte Mitglied sollte c3 nicht c2 sein

select 
    c1.full_name , c3.full_name as Father 
from 
    members c1, members c2 
inner join members c3 
    on c1.father_id = c3.id 
+0

Sie brauchen nicht, dass "Mitglieder c2" Sie können es entfernen, wenn Sie möchten –

0

Ich habe den Code tatsächlich funktioniert, mit links verbindet. Ich bin mir nicht sicher, warum die inneren Verbindungen nicht funktionieren würden, aber das löste mein Problem:

SELECT 
    members.full_name, b.full_name AS Father, c.full_name AS Mother 
FROM 
    members 
LEFT JOIN 
    members b ON (members.father_id = b.id) 
LEFT JOIN 
    members c ON (members.mother_id = c.id)