Как объединить результаты внутреннего соединения mysql из строк в столбцы

Возможно, мой вопрос не так ясен, позвольте мне объяснить: Мне нужно получить список всех пользователей вместе с соответствующей комбинацией номер/оптовик клиента, каждый клиент имеет 1 до 4 различных номеров клиентов/оптовиков.

В моем db у меня есть 2 таблицы

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

Использование простой INNER JOIN Я получил дублированные строки клиента, по одному для каждого соответствующего клиентского номера/оптовика

Мне удалось исправить результаты, используя GROUP_CONCAT в этом запросе:

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

Пока все хорошо, но мне нужно "взорвать" комбинацию номер клиента/оптовика в разные столбцы, чтобы мои результаты выглядели так:

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

Выполнение этого после получения результатов запроса с помощью простого взлома PHP не является вариантом, потому что я использую класс для создания файла XLS и его основываясь на столбцах результатов запроса, любые идеи будут оценены.

Ответ 1

То, что вы хотите, обычно называется " pivot".

Вот как вы его кодируете в sql, используя дополнительное соединение для каждого дополнительного столбца:

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

Обратите внимание, что дополнительные объединения избегают дублирования объединений путем добавления постоянно возрастающего id-условия в предложении ON для дополнительных объединений. Если идентификатор не является подходящим столбцом для заказа, выберите другое, чтобы отделить соединения.