2011-12-02 9 views
6

używam MySQL i mają dwa stoły bazy danych w następujący sposób:Jak mogę to zrobić z MySQL?

Użytkownicy

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

Przedmioty

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

Co zapytanie jest wymagana do wytworzenia następujący wynik?

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

że takie próby z INNER JOIN, a kończy się z 5 rzędów (jeden dla każdego obiektu odpowiedniego wiersza).

Każda pomoc bardzo ceniona.

+4

to wywołanie 'Pivot' zapytania –

+1

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

+0

możliwe duplikat [Czy zapytań MySQL kolei rzędach do kolumn?] (http://stackoverflow.com/questions/4336985/can-a-mysql-query-turn-rows-into-columns) –

Odpowiedz

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

to również wymaga ostrzeżenia @ruakh: Jeśli "A", "B" i "C" są znane wcześniej –

+0

To działało idealnie, dziękuję. Był także szybszy niż opublikowana metoda sub-zapytania. – gjb

3

Jeśli 'A', 'B' i 'C' są znane z wyprzedzeniem, można to zrobić:

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

być może nie jest to zapytanie, które prosicie, ale to jest czyste i sipmle kwerendy, że mam używane w twojej sytuacji:

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 

To zapytanie "wypełnia" puste miejsca. Więc możesz spożywać zestaw wyników z dwoma zagnieżdżonymi foreach (lub czymś podobnym) i narysować pożądaną tabelę.

Powiązane problemy