2016-06-21 23 views
0

Ich habe ein Problem, wo ich mehrere Spalten durch eine ID verbinden möchten.Mysql beitreten auf mehrere Spalten

Meine erste Tabelle sieht wie folgt aus:

submitter_id reviewer_id processor_id 
75    34   91 

Die Tabelle, die ich will sieht wie folgt verbinden:

id first_name last_name 
75 Bob   Smith 
34 Albert  McDonald 
91 Joe   Blo 

Ich versuche, eine Abfrage zu erstellen, die bei jedem ID aussehen in meine erste Tabelle und dann den Vor- und Nachnamen für jede ID.

Zum Beispiel kann eine Abfrage, die diese etwas zurückgibt, sollte wie:

[ 
    75 => "Bob Smith", 
    34 => "Albert McDonald", 
    91 => "Joe Blo" 
]; 

Kann jemand mir helfen, eine Abfrage erstellen, die dies erreicht werden kann? Vielen Dank!

Antwort

2

Registriert die gleiche Tabelle 3-mal mit verschiedenen Alias-Namen

select t1.submitter_id, t1.reviewer_id, t1.processor_id, 
     t2.first_name as submitter_firstname, t2.last_name as submitter_lastname, 
     t3.first_name as reviewer_firstname, t3.last_name as reviewer_lastname, 
     t4.first_name as processor_firstname, t4.last_name as processor_lastname 
from firstTable t1 
left join namesTable t2 on t1.submitter_id = t2.id 
left join namesTable t3 on t1.reviewer_id = t3.id 
left join namesTable t4 on t1.processor_id = t4.id 
+0

Es ist ein guter Ansatz, aber stimmt nicht mit der erwarteten Ausgabe überein. –

0

denke ich, was Ihr eigentlich suchen ist dies eher wie:

SELECT n.id, CONCAT(n.first_name, ' ', n.last_name) 
    FROM names n 
    JOIN ids i 
    ON n.id = i.submitter_id 
    OR n.id = i.reviewer_id 
    OR n.id = i.processor_id 
GROUP BY n.id; 

Dieses nur tut man beitreten, die Datensätze zeigt mit den 2 Spalten, die Sie wirklich wollen und einschränkt, so dass Nutzer nur einmal aufgeführt werden. Da Sie wahrscheinlich nicht nur die ID zurückgeben möchten, wenn der Benutzer kein Namens-Setup hat, wollen Sie keinen Link-Join.

Bearbeiten: Wenn Sie Indizes benötigen, können Sie eine auf übergebende_id, reviewer_id, processor_id machen, wenn die Leistung für Sie benötigt wird.

0

Sie wollen alles in einem resultset, so dass Sie UNION ALL verwenden:

SELECT p.id, CONCAT(p.first_name, ' ', p.last_name) as name 
    FROM person p 
    JOIN firstTable f 
    ON p.id = f.submitter_id 

UNION ALL 

SELECT p.id, CONCAT(p.first_name, ' ', p.last_name) as name 
    FROM person p 
    JOIN firstTable f 
    ON p.id = f.reviewer_id 

UNION ALL 

SELECT p.id, CONCAT(p.first_name, ' ', p.last_name) as name 
    FROM person p 
    JOIN firstTable f 
    ON p.id = f.processor_id 

Ich denke, das ist ein besserer Ansatz, wenn Sie planen, nur für einige Gruppe einige Bedingungen zu verwenden, wie where reviewer_id > 100. Wenn nicht, der Herr. Egole ist sauberer.

+0

Herr. Egoles ist prägnanter, aber Ihr sollte in der Lage sein, Indizes besser zu nutzen. – Uueerdo

0

Angenommen, Sie benötigen eine Zeile in der ersten Tabelle, um eine Zeile im Ergebnis zurückzugeben.

SELECT tt.submitter_id , CONCAT(ta.first_name, ' ', ta.last_name) , 
     tt.reviewer_id , CONCAT(tb.first_name, ' ', tb.last_name) , 
     tt.processor_id , CONCAT(tc.first_name, ' ', tc.last_name) 
FROM `transaction` as tt , `names` as ta , `names` as tb , `names` as tc 
WHERE tt.submitter_id = ta.id AND 
     tt.reviewer_id = tb.id AND 
     tt.processor_id = tc.id 

Das Ergebnis wäre die 3 IDs mit den entsprechenden Namen in einer Zeile pro Transaktion.