2012-10-05 18 views
10

Może moje pytanie nie jest tak jasne, proszę pozwolić mi wyjaśnić: Potrzebuję uzyskać listę wszystkich użytkowników wraz z odpowiednią kombinacją numerów klientów/hurtowników, każdy klient ma 1 do 4 różnych Numer klienta/hurtownik comboJak grupować wyniki łączenia wewnętrznego mysql z wierszy w kolumny

W moim db mam 2 tabele

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 

Korzystanie prosta INNER JOIN dostałem wiersze klienta powielane, po jednym dla każdego odpowiedni numer klienta/hurtownika

udało mi się ustalić wyniki stosując GROUP_CONCAT w tego zapytania:

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 

Jak na razie dobrze, ale muszę „eksplodować” Połączenie numer klienta/hurtowni w różnych kolumn więc moje wyniki mogą wyglądać następująco :

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

Robi to po otrzymaniu wyników zapytania z prostym PHP eksplodować nie jest opcją, ponieważ używam klasę, aby wygenerować plik XLS i jego podstawie moich zapytań kolumn wynikowych, jakieś pomysły zostaną docenione .

Odpowiedz

5

To, czego chcesz, to na ogół "pivot".

Oto jak zakodować go w SQL przy użyciu dodatkowego przyłączenia za każdą dodatkową kolumnę:

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 

Należy zauważyć, że dodatkowo łączy uniknąć powielania dołącza dodając coraz większej kondycji ID w klauzuli ON dla dodatkowe sprzężenia. Jeśli id ​​nie jest odpowiednią kolumną zamawiania, wybierz inną opcję, aby oddzielić połączenia.

+0

"Pivot" Nauczyłem się czegoś nowego dzisiaj, wielkie dzięki, twoje zapytanie działa tak, jak potrzebowałem – hey259

Powiązane problemy