konto usunięte

Temat: problem z join

hej,
potrzebuję małej wskazówki..

mam 2 tabele.

T1 - dane

id_1, id_2, id_3

T2 - słownik

id, nazwa

Każde z tych id_1, id_2, id_3 ma wartość id z T2

Potrzebuję wyświetlić T1 z dołączonymi kolumnami nazwa1, nazwa2, nazwa3, gdzie wartościami dołączonych kolumn są odpowiednie nazwy w oparciu o id_1, id_2, id_3.

Jak sformułować zapytanie?
Mariusz Witek

Mariusz Witek Programista PHP,
Front-End Developer

Temat: problem z join

Wystarczy proste rozwiązanie:

SELECT
id_1, (SELECT t2.nazwa FROM t2 WHERE t2.id = t1.id_1 ) nazwa_1,
id_2, (SELECT t2.nazwa FROM t2 WHERE t2.id = t1.id_2 ) nazwa_2,
id_3, (SELECT t2.nazwa FROM t2 WHERE t2.id = t1.id_3 ) nazwa_3
FROM
t1


Ale jesli masz możliwość zmiany struktury tabel, to powinieneś jak najszybciej to zrobić i zaprojektować bazę poprawnie. Obecna wersja jak sam widzisz nie za bardzo się nadaje.

konto usunięte

Temat: problem z join

Mariusz Witek:
Wystarczy proste rozwiązanie:

SELECT
id_1, (SELECT t2.nazwa FROM t2 WHERE t2.id = t1.id_1 ) nazwa_1,
id_2, (SELECT t2.nazwa FROM t2 WHERE t2.id = t1.id_2 ) nazwa_2,
id_3, (SELECT t2.nazwa FROM t2 WHERE t2.id = t1.id_3 ) nazwa_3
FROM
t1


Ale jesli masz możliwość zmiany struktury tabel, to powinieneś jak najszybciej to zrobić i zaprojektować bazę poprawnie. Obecna wersja jak sam widzisz nie za bardzo się nadaje.

alo
to rozwiązanie jest bardzo, ale to bardzo (tu się gryzę w język, ale cisną się obelżywe słowa)

bo dla każdego wiersz odpalasz podzapytanie, no zlituj sie MYSQL ma coś takiego jak aliasy!

select S1.nazwa_1, S2.nazwa_2, S3.nazwa_3
from t1 left join T2 as S1 on t1.id_1 = S1.id
left join T2 as S2 on t1.id_2 = S1.id
left join T2 as S3 on t1.id_3 = S1.id
Przemysław R. edytował(a) ten post dnia 23.02.12 o godzinie 16:36
Mariusz Witek

Mariusz Witek Programista PHP,
Front-End Developer

Temat: problem z join

Hehe masz całkowitą rację.
Przy pisaniu tego zapytania nie zwracałem w ogóle uwagi na wydajność takiego rozwiązania, ot po prostu podałem coś co mi pierwsze wpadło do głowy i powinno działać.

Bardziej chciałem zaznaczyć to, że sama struktura tabeli powinna zostać zmieniona.

PS
Przemek, piszesz o aliasach, a sam o nich zapomniałeś ;)

konto usunięte

Temat: problem z join

Mariusz Witek:
PS
Przemek, piszesz o aliasach, a sam o nich zapomniałeś ;)

no fakt , czeski błąd

konto usunięte

Temat: problem z join

Przemysław R.:
select S1.nazwa_1, S2.nazwa_2, S3.nazwa_3
from t1 left join T2 as S1 on t1.id_1 = S1.id
left join T2 as S2 on t1.id_2 = S1.id
left join T2 as S3 on t1.id_3 = S1.id

Coś w tym zapytaniu jest nie tak, przecież S1.nazwa_1 to nie jest nazwa kolumny.
Właśnie mam problem w zrozumieniu idei tych aliasów, nigdy ich nie używałem.

konto usunięte

Temat: problem z join


select
S1.nazwa as nazwa_1
, S2.nazwa as nazwa_2
, S3.nazwa as nazwa_3
from t1
left join T2 as S1 on t1.id_1 = S1.id
left join T2 as S2 on t1.id_2 = S1.id
left join T2 as S3 on t1.id_3 = S1.id


przyjrzyj się słowu AS
Tomasz Zadora

Tomasz Zadora programuję

Temat: problem z join

Po to są aliasy aby rozwiązywać konflikty nazw przy złożonych zapytaniach, chociażby wtedy kiedy klucz obcy jest "rekurencyjny" czyli wskazuje na tą samą tabelę.

SELECT mytable.name, parent.name as parent_name FROM (mytable, mytable as parent) WHERE mytable.id = 1 AND parent.id = mytable.mytable_id

Gdzie mytable.mytable_id to "rekurencyjny" klucz obcy.

Poprawniej (bo rodzica może nie być):

SELECT mytable.name, parent.name as parent_name FROM mytable
LEFT JOIN mytable as parent ON parent.id = mytable.mytable_id
WHERE mytable.id = 1Tomasz Zadora edytował(a) ten post dnia 24.02.12 o godzinie 14:28

konto usunięte

Temat: problem z join

Dzięki wielkie, pobawię się tym.

Następna dyskusja:

problem z polskimi znakami




Wyślij zaproszenie do