2011-12-02 12 views
6

Sto usando MySQL e hanno tabelle di due database come segue:Come posso fare questo con MySQL?

Utenti

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

Oggetti

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

Che domanda è necessario per produrre il seguente risultato?

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

Ho provato questo con un INNER JOIN, ma finiscono con 5 righe (uno per ogni riga oggetto corrispondente).

Qualsiasi aiuto molto apprezzato.

+4

questo è chiamata 'interrogazione Pivot' –

+1

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

+0

possibile duplicato del [Può una query MySQL righe turno nelle colonne?] (http://stackoverflow.com/questions/4336985/can-a-mysql-query-turn-rows-into-columns) –

risposta

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

anche questo richiede l'avviso @ruakh: Se 'A', 'B' e 'C' sono noti in anticipo –

+0

Ciò ha funzionato perfettamente, grazie. Era anche più veloce del metodo di sub-query pubblicato. – gjb

3

Se 'A', 'B', e 'C' sono noti in anticipo, si può fare questo:

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

forse questo non è la query che si sta chiedendo, ma questa è una query pulito e sipmle che ho utilizzato nella tua situazione:

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 

Questa query "riempie" gli spazi vuoti. Quindi puoi consumare il set di risultati con due foreach nidificati (o simili) e disegnare la tabella desiderata.

Problemi correlati