Łaczenie tabeli samej ze sobą

0

Witam

Mam następująca tabelę phone_numbers posiadającą strukturę
pk: id
user_id
phone_type (ENUM: phone_a, phone_b, phone_c)
phone_number

Chce jako wynik otrzymać tabelę, gdzie będą wszyscy użytkownicy i trzy kolumny zawierające kolejne numery telefonów użytkowników, tj. user_id, phone_a, phone_b, phone_c
Każdy user może mieć max jeden numer tego samego typu

Udało mi się to zrealizować zapytaniem:

SELECT DISTINCT phone_numbers.user_id, pa.phone_a, pb.phone_b, pc.phone_c
FROM phone_numbers 
LEFT JOIN (SELECT user_id, phone_number AS phone_a FROM phone_numbers WHERE phone_type = "phone_a") AS pa ON phone_numbers.user_id = pa.user_id
LEFT JOIN (SELECT user_id, phone_number AS phone_b FROM phone_numbers WHERE phone_type = "phone_b") AS pb ON phone_numbers.user_id = pb.user_id
LEFT JOIN (SELECT user_id, phone_number AS phone_c FROM phone_numbers WHERE phone_type = "phone_c") AS pc ON phone_numbers.user_id = pc.user_id
ORDER BY phone_numbers.user_id 

Pytanie, czy można to zrobić w jakiś bardziej elegancki sposób, bez używania DISTINCT

1

Zrezygnuj z sortowania, zmniejsza wydajność, chyba że złączysz to z tabelą użytkowników i chcesz mieć posortowanych alfabetycznie.
Już lepiej tak:

select u.user_id, p1.phone_number as phone_a, p2.phone_number as phone_b, p3.phone_number as phone_c
from (select user_id from phone_numbers group by user_id) as u
left join phone_numbers p1 on u.user_id = p1.user_id and p1.phone_type = 'A'
left join phone_numbers p2 on u.user_id = p2.user_id and p2.phone_type = 'B'
left join phone_numbers p3 on u.user_id = p3.user_id and p3.phone_type = 'C'

Jaka baza danych? Bo część wspiera robienie pivot'ów, które będzie tu pomocne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1