2012-10-05 13 views
10

Vielleicht ist meine Frage nicht so klar, bitte lassen Sie mich erklären: Was ich brauche, ist eine Liste aller Benutzer mit einer entsprechenden Client-Nummer/Großhändler-Kombination erhalten, jeder Kunde hat 1 bis zu 4 verschiedene Kundennummer/Großhändler ComboWie mysql innere Join-Ergebnisse von Zeilen in Spalten gruppieren

In meinem db habe ich 2 Tabellen

USERS 
id | name 
--------- 
1 | a 
2 | b 

CLIENT_NUMBERS 
id | user_id | number | wholesaler 
---------------------------------- 
1 | 1  | ac1 | aw1 
2 | 1  | ac2 | aw2 
3 | 2  | bc1 | bw1 

mit einem einfachen INNER ich JOIN bekam Client Zeilen dupliziert, eine für jedes entsprechende Kundennummer/Großhändler

Ich habe es geschafft, die Ergebnisse mit GROUP_CONCAT in dieser Abfrage zu beheben:

SELECT a.id AS user_id, a.name AS Name 
GROUP_CONCAT(b.client_no, ', ', b.wholesaler SEPARATOR '; ') AS client_no_wholesaler 
FROM users AS a 
INNER JOIN client_numbers AS b ON a.id = b.user_id 
GROUP BY ID 

user_id | name | client_no_wholesaler 
-------------------------------------------- 
1  | a | ac1, aw1; ac2, aw2 
2  | b | bc1, bw1 

So weit so gut, aber ich muss die Kundennummer/Großhändler Kombination in verschiedenen Spalten zu „explodieren“, so meine Ergebnisse wie folgt aussehen :

user_id | name | client_no_wholesaler1 | client_no_wholesaler2 | ...up to 4 
---------------------------------------------------------------------------- 
1  | a | ac1, aw1    | ac2, aw2    | 
2  | b | bc1, bw1    |      | 

Dadurch, nachdem die Ergebnisse der Abfrage mit einem einfachen PHP explodiert immer ist keine Option, da ich eine Klasse bin mit seinem einer XLS-Datei und auf meinem Abfrageergebnis Spalten zu generieren, werden alle Ideen geschätzt .

Antwort

5

Was Sie wollen, wird allgemein als "pivot" bezeichnet.

Hier ist, wie Sie es in SQL-Code ein extra beitreten für jede zusätzliche Spalte:

SELECT 
    a.id AS user_id, 
    a.name AS Name, 
    CONCAT(b1.client_no, ', ', b1.wholesaler) AS client_no_wholesaler1, 
    CONCAT(b2.client_no, ', ', b2.wholesaler) AS client_no_wholesaler2, 
    CONCAT(b3.client_no, ', ', b3.wholesaler) AS client_no_wholesaler3, 
    CONCAT(b4.client_no, ', ', b4.wholesaler) AS client_no_wholesaler4 
FROM users AS a 
JOIN client_numbers AS b1 ON b1.user_id = a.id 
LEFT JOIN client_numbers AS b2 ON b2.user_id = a.id and b2.id > b1.id 
LEFT JOIN client_numbers AS b3 ON b3.user_id = a.id and b3.id > b2.id 
LEFT JOIN client_numbers AS b4 ON b4.user_id = a.id and b4.id > b3.id 
GROUP BY 1, 2 

Beachten Sie, dass die zusätzliche vermeiden verbindet doppelte schließt sich durch die Zugabe von einer ständig wachsenden ID Bedingung in der ON Klausel für das Extra schließt sich an. Wenn id keine geeignete Sortierspalte ist, wählen Sie etwas anderes, um die Joins zu trennen.

+0

"Pivot" Ich habe heute etwas Neues gelernt, danke, Ihre Anfrage funktioniert so, wie ich es brauche – hey259

Verwandte Themen