2012-10-05 25 views
10

Forse la mia domanda non è così chiara, per favore lasciatemi spiegare: Quello che mi serve è ottenere un elenco di tutti gli utenti insieme a una combinazione numero cliente/grossista corrispondente, ogni cliente ha 1 fino a 4 diverse combo codice cliente/grossistaCome raggruppare mysql inner join risultati da righe in colonne

Nel mio db ho 2 tabelle

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 

Utilizzando un semplice INNER JOIN ho ottenuto file client duplicati, uno per ogni corrispondente numero di client/grossista

Sono riuscito a fissare i risultati utilizzando group_concat in questa query:

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 

Fin qui tutto bene, ma ho bisogno di "esplodere" la combinazione di cifre client/grossista in diverse colonne così i miei risultati possono assomigliare a questo :

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

in questo modo dopo aver ottenuto i risultati della query con un semplice PHP explode non è un'opzione perché sto utilizzando una classe per generare un file XLS e la sua base a mia domanda colonne dei risultati, tutte le idee saranno apprezzati .

risposta

5

Quello che si desidera è generalmente chiamato "pivot".

Ecco come si codifica in SQL utilizzando join un extra per ogni colonna in più:

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 

Si noti che l'extra unisce evitare duplicati si unisce con l'aggiunta di una condizione di id sempre crescente nella clausola ON per i join extra. Se id non è una colonna di ordinamento adatta, scegli qualcos'altro per separare i join.

+0

"Pivot" ho imparato qualcosa di nuovo oggi, grazie mille, la tua query funziona come avevo bisogno – hey259