2011-12-02 14 views
6

estoy usando MySQL y tienen dos tablas de bases de datos de la siguiente manera:¿Cómo puedo hacer esto con MySQL?

Usuarios

id username 
-------------- 
1 Bill 
2 Steve 

Objetos

user_id key value 
---------------------- 
1   A  X 
1   B  Y 
1   C  Z 
2   A  S 
2   C  T 

Qué consulta se requiere para producir el siguiente resultado?

username A B C 
------------------- 
Bill  X Y Z 
Steve  S  T 

He intentado esto con un INNER JOIN, pero terminan con 5 filas (una para cada fila objeto correspondiente).

Cualquier ayuda muy apreciada.

+4

esto es llamada 'consulta Pivot' –

+1

http://stackoverflow.com/questions/6605604/mysql-pivot-query-results-with-group-by – Benjam

+0

posible duplicado de [Puede una consulta MySQL giro filas en columnas?] (http://stackoverflow.com/questions/4336985/can-a-mysql-query-turn-rows-into-columns) –

Respuesta

2
select u.username 
    , oA.value A 
    , oB.value B 
    , oC.value C 
    from users u 
left 
    join objects oA 
    on u.id = oA.user_id 
    and oA.key = 'A' 
left 
    join objects oB 
    on u.id = oB.user_id 
    and oB.key = 'B' 
left 
    join objects oC 
    on u.id = oC.user_id 
    and oC.key = 'C' 
+0

esto también necesita la advertencia @ruakh: Si 'A', 'B' y 'C' son conocidos de antemano –

+0

Eso funcionó perfectamente, gracias. También fue más rápido que el método de subconsulta publicado. – gjb

3

Si 'A', 'B' y 'C' son conocidos de antemano, usted puede hacer esto:

SELECT users.username, 
     (SELECT objects.value 
      FROM objects 
      WHERE objects.user_id = users.id 
      AND objects.`key` = 'A' 
     ) AS a, 
     (SELECT objects.value 
      FROM objects 
      WHERE objects.user_id = users.id 
      AND objects.`key` = 'B' 
     ) AS b, 
     (SELECT objects.value 
      FROM objects 
      WHERE objects.user_id = users.id 
      AND objects.`key` = 'C' 
     ) AS c 
    FROM users 
ORDER 
    BY users.username 
; 
0

tal vez esta no es la consulta que está solicitando, pero esto es una consulta limpia y sipmle que tengo usado en su situación:

select objects.*, matrix.* 
from 
     (select users.id, o.key 
      from users, (select distinct key from objects) as o 
     ) 
as matrix left join objects on matrix.id = objects.user_id 
          and matrix.key = objets.key 
order by matrix.id, matrix.key 

Esta búsqueda "llena" los espacios en blanco. De modo que puede consumir el conjunto de resultados con dos foreach anidados (o lo que sea similar) y dibujar la tabla deseada.

Cuestiones relacionadas