Łaczenie tabeli samej ze sobą

Odpowiedz Nowy wątek
2011-09-14 18:23
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

Pozostało 580 znaków

2011-09-15 17:08

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.

wydaje mi się, że czas sortowania będzie pomijalny w porównaniu z czasem wykonania reszty zapytania. łatwo to sprawdzić na planie wykonania. - ŁF 2011-09-15 17:53
Fakt, tym bardziej że sortowanie jest pewnie po części klucza, przynajmniej spodziewa się z tego co autor napisał że kluczem powinno być user_id+phone_type, ale... :) Natomiast warto pamiętać że jeśli sortowanie nie jest konieczne, warto je pominąć. - massther 2011-09-15 18:01
Problem był typowo teoretyczny i szukałem rozwiązania niezależnego od bazy. A sortowanie znalazło się tam przypadkowo, skopiowałem niepotrzebnie. O takie coś mi właśnie chodziło, rozwiązanie bardziej eleganckie i czytelne. - tauruss 2011-09-17 17:38

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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