2012-10-05 30 views
10

Tal vez mi pregunta no es tan clara, por favor déjenme explicar: Lo que necesito es obtener una lista de todos los usuarios junto con una combinación de número de cliente/mayorista correspondiente, cada cliente tiene 1 hasta 4 diferentes combo número de cliente/mayoristaCómo agrupar los resultados de combinación interna de mysql de filas en columnas

En mi db tengo 2 tablas

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 

Usando un simple INNER JOIN yo nos filas de clientes duplicados, uno para cada número de cliente/mayorista correspondientes

Me las he arreglado para fijar los resultados utilizando GROUP_CONCAT en esta consulta:

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 

Hasta aquí todo bien, pero necesito "explotar" la combinación de cliente/número de mayorista en diferentes columnas para que mis resultados pueden tener este aspecto :

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

Hacer esto después de recibir los resultados de la consulta con un simple PHP explotar no es una opción porque estoy usando una clase para generar un archivo XLS y su base de mis columnas de resultados de la consulta, será apreciado alguna idea .

Respuesta

5

Lo que quiere se suele llamar "pivot".

Así es como se codifican en SQL utilizando unirse a un extra por cada columna adicional:

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 

Tenga en cuenta que el extra se une a evitar duplicado se une mediante la adición de una condición de Identificación del cada vez mayor en la cláusula ON de el extra se une Si id no es una columna de pedido adecuada, elija otra cosa para separar las uniones.

+0

"Pivot" He aprendido algo nuevo hoy, muchas gracias, tu consulta funciona como lo necesitaba – hey259

Cuestiones relacionadas