2016-12-09 2 views
1

Ich arbeite mit einer MySQL-Datenbank, aber ich stehe vor einem Problem. Ich habe eine Liste von Benutzern, die ungefähr so ​​aussieht.Kombinieren von Spalten in einzelne Spalten mit einer Brücke

Users 
+----+------+ 
| ID | Name | 
+----+------+ 
| 1 | Jim | 
| 2 | Cal | 
| 3 | Rob | 
| 4 | John | 
| 5 | Paul | 
+----+------+ 

Jetzt habe ich zwei weitere Tische,

Teams   Role 
+----+----------+ +---+------+ 
| ID | NameTeam | |ID | Role | 
+----+----------+ +---+------+ 
| 1 | Team1 | | 1 |Leader| 
| 2 | Team2 | | 2 |Member| 
| 3 | Team3 | | 3 |Role3 | 
| 4 | Team4 | | 4 |Role4 | 
| 5 | Team5 | | 5 |Role5 | 
+----+----------+ +---+------+ 

Bitte nicht, dass alle IDs sind Primärschlüssel.

Schließlich gibt es eine Tabelle, die als Brücke für die obigen Tabellen dient.

Alle diese drei Spalten sind Fremdschlüssel, die mit den Primärschlüsseln in den drei Tabellen Benutzer, Teams und Rolle verknüpft sind.

Was ich möchte ist eine Liste aller Benutzer und in einer Spalte die Informationen der Teams, denen sie angehören, zusammen mit der Rolle, die sie in diesem Team haben. Ich dachte mir, dass ich dies durch eine Linksbindung tun könnte, aber es ist möglich, dass ein Benutzer mit mehreren Teams verbunden wird und die Zeile dann dupliziert wird.

Meine Anfrage bisher:

select * from Users 
LEFT OUTER JOIN Bridge 
ON Bridge.UserID = Users.UserID; 

die in Duplikaten führt wie:

Result 
+----+------+---------+--------+--------+ 
| ID | Name | ID_team | ID_user| ID_role| 
+----+------+---------+--------+--------+ 
| 1 | Jim | 1  | 1  | 1  | << Twice Jim here 
| 1 | Jim | 2  | 1  | 3  | << 
| 2 | Cal | 1  | 2  | 2  | 
| 3 | Rob | 1  | 3  | 3  | 
| 4 | John | 2  | 4  | 1  | 
| 5 | Paul | 2  | 5  | 2  | 
+----+------+---------+--------+--------+ 


    Desired result 
+----+------+----------------------------+ 
| ID | Name | Team and role    | 
+----+------+----------------------------+ 
| 1 | Jim | Team1: Leader,Team2:role3 | <<Nice sum up. 
| 2 | Cal | Team1: Member    | 
| 3 | Rob | Team1: Role3    | 
| 4 | John | Team2: Leader    | 
| 5 | Paul | Team2: Member    | 
+----+------+----------------------------+ 

Ist so etwas überhaupt möglich mit einer einzigen Abfrage? Wenn nicht, könnte ich immer etwas ähnliches mit php erstellen, aber es wäre wirklich nett, wenn es eine einzige Abfrage wäre.

Also meine Frage ist, wie kann ich das gewünschte Ergebnis bekommen?

+0

Sicherlich müssen Sie Bridge-Tabelle in 2 Bridge-Tabellen teilen 1) Benutzer ist im Team und 2) Benutzer hat Rolle – RiggsFolly

Antwort

1

Sie müssen zuerst alle Tabellen verknüpfen.

Dann für Ihre gewünschte Ausgabe müssen Sie CONCAT zusammen mit GROUP_CONCAT Funktion verwenden.

SELECT 
U.ID, 
U.Name, 
GROUP_CONCAT(CONCAT(T.NameTeam,':',R.Role)) AS 'Team and Role' 
FROM Bridge B 
INNER JOIN Users U ON U.ID = B.ID_user 
INNER JOIN Teams T ON T.ID = B.ID_team 
INNER JOIN Role R ON R.ID = B.ID_role 
GROUP BY B.ID_user 

EDIT:

Um für alle Benutzer unabhängig von Ergebnis zu erhalten, ob der entsprechende Datensatz existiert in Bridge Tabelle oder nicht:

SELECT 
U.ID, 
U.Name, 
GROUP_CONCAT(CONCAT(T.NameTeam,':',R.Role)) AS 'Team and Role' 
FROM Users U 
LEFT JOIN Bridge B ON U.ID = B.ID_user 
LEFT JOIN Teams T ON T.ID = B.ID_team 
LEFT JOIN Role R ON R.ID = B.ID_role 
GROUP BY U.ID; 

SEE DEMO

+0

Vielen Dank für Ihre Antwort. Es gibt nur eine kleine Sache, die ich vielleicht vergessen habe zu erwähnen. Wenn der Benutzer nicht Teil eines Teams ist, sollte es dennoch aufgeführt sein. Ich habe versucht, deine Antwort mit verschiedenen Arten von Joins zu verwenden, aber das schien nicht zu funktionieren. Ist das auch möglich? Der Rest des Tisches war perfekt! – Daan

+0

Sie müssen die Reihenfolge ändern und von "INNER JOIN" zu "LEFT JOIN" wechseln. Bitte überprüfen Sie die aktualisierte Antwort unter ** Bearbeiten ** Abschnitt. @Daan – 1000111

+0

Genau das, was ich gesucht habe! – Daan

Verwandte Themen