znowu LEFT JOIN
WojtekB - 27-03-2007 00:03
znowu LEFT JOIN
Witam, mam 2 tabele, dla przykładu: ksiazki i w niej pola: id_ks, tytul, autor, tlumacz i drugą osoby z polami id_os, ime, nazwisko
W tabeli ksiazki w polach autor i tlumacz wpisane jest id_os.
Aby wyswietlic mam takie zapytanie: "SELECT * FROM ksiazki LEFT JOIN osoby ON ksiazki.autor=osoby.id_os" i to dziala ale ja chce pokazywac rownierz tlumacza, wiec rozbudowalem zapytanie: "SELECT * FROM ksiazki LEFT JOIN osoby ON (ksiazki.autor=osoby.id_os And ksiazki.tlumacz=osoby.id_os)" jednak wówczas nie wyświetla mi sie nic. Co powinienem zmienić?
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 27-03-2007 00:03
WojtekB wrote: > Witam, > mam 2 tabele, dla przykładu: > ksiazki i w niej pola: id_ks, tytul, autor, tlumacz > i drugą > osoby z polami id_os, ime, nazwisko > > W tabeli ksiazki w polach autor i tlumacz wpisane jest id_os. > > Aby wyswietlic mam takie zapytanie: > "SELECT * FROM ksiazki LEFT JOIN osoby ON ksiazki.autor=osoby.id_os" > i to dziala ale ja chce pokazywac rownierz tlumacza, wiec rozbudowalem > zapytanie: > "SELECT * FROM ksiazki LEFT JOIN osoby ON (ksiazki.autor=osoby.id_os And > ksiazki.tlumacz=osoby.id_os)" > jednak wówczas nie wyświetla mi sie nic. > Co powinienem zmienić?
Dwa razy użyj tabeli osoby z różnymi aliasami.
-- P.M.
=?ISO-8859-2?Q?Cezary_Gr=B1dys?= - 27-03-2007 00:03
Użytkownik WojtekB napisał: > Witam, > mam 2 tabele, dla przykładu: > ksiazki i w niej pola: id_ks, tytul, autor, tlumacz
Zapominasz w tym momencie, że książka może mieć kilku autorów i tłumaczy.
-- Cezary Grądys czarekgr@wa.onet.pl
WojtekB - 27-03-2007 00:03
Cezary Grądys wrote:
> Użytkownik WojtekB napisał: >> Witam, >> mam 2 tabele, dla przykładu: >> ksiazki i w niej pola: id_ks, tytul, autor, tlumacz > > > Zapominasz w tym momencie, że książka może mieć kilku autorów i tłumaczy. > > > To tylko przykład. Chce najpierw dojść do sposobu wyswietlania danych osoby na podstawie jej id z tabeli ksiazki. Oczywiscie nie chce używac zapytan w pętli.
Grzegorz Danowski - 27-03-2007 00:03
"WojtekB" <antyspam@spam.no> wrote in message news:eu880j$lfj$1@atlantis.news.tpi.pl... > Witam, > mam 2 tabele, dla przykładu: > ksiazki i w niej pola: id_ks, tytul, autor, tlumacz > i drugą > osoby z polami id_os, ime, nazwisko > > W tabeli ksiazki w polach autor i tlumacz wpisane jest id_os. > > Aby wyswietlic mam takie zapytanie: > "SELECT * FROM ksiazki LEFT JOIN osoby ON ksiazki.autor=osoby.id_os" > i to dziala ale ja chce pokazywac rownierz tlumacza, wiec rozbudowalem > zapytanie: > "SELECT * FROM ksiazki LEFT JOIN osoby ON (ksiazki.autor=osoby.id_os And > ksiazki.tlumacz=osoby.id_os)" > jednak wówczas nie wyświetla mi sie nic. > Co powinienem zmienić?
Nie wyświetla się nic, bo to co napisałeś wyszukuje te książki dla których autor jest taki sam jak tłumacz (a w Twojej bazie takowych nie ma). Aby napisać poprawne zapytanie powinieneś skorzystać z rady Pawła, ale skoro dalej masz z tym problem, to skorzystaj z kolejnej wskazówki:
SELECT * FROM ksiazki LEFT JOIN osoby As Autorzy ON ksiazki.autor = Autorzy.id_os Left Join osoby As Tlumacze On ksiazki.tlumacz = Tlumacze.id_os -- Pozdrawiam Grzegorz
WojtekB - 27-03-2007 00:03
Grzegorz Danowski wrote:
> > SELECT > * > FROM > ksiazki > LEFT JOIN > osoby As Autorzy > ON > ksiazki.autor = Autorzy.id_os > Left Join > osoby As Tlumacze > On > ksiazki.tlumacz = Tlumacze.id_os
Spróbowałem jak proponowałeś jednak z małą modyfikacją bo założyłem ze pisząc Autorzy i Tlumacze miałeś na mysli autor i tlumacz, Wysmażyłem coś takiego:
SELECT * FROM ksiazki LEFT JOIN osoby As autor ON ksiazki.autor = autor.id_os Left Join osoby As tlumacz On ksiazki.tlumacz = tlumacz.id_os
Niestety w efekcie otrzymuje tlumacza w miejscu autora i tłumacza (2x tlumacz) :-( Ale chyba wiem (nie do konca) gdzie robię błąd Wynik zapytania wyswietlam w ten sposób: while($wiersz=mysql_fetch_array ($wynik)) { echo "".$wiersz['tytul']." autor:".$wiersz['imie']." ".$wiersz['nazwisko']." tlumacz:".$wiersz['imie']." ".$wiersz['nazwisko']."";} logiczne ze pokaze mi te same dane autora i tlumacza. Jak to inaczej zrobić?
Grzegorz Danowski - 27-03-2007 00:03
"WojtekB" <antyspam@spam.no> wrote in message news:eu96ag$jt4$1@atlantis.news.tpi.pl... > Spróbowałem jak proponowałeś jednak z małą modyfikacją bo założyłem ze > pisząc Autorzy i Tlumacze miałeś na mysli autor i tlumacz, Wysmażyłem coś > takiego: ..... Ja bym unikał nadawania tabelom takich samych aliasów jak nazwy pól (u Ciebie tłumacz jest nazwą pola a raz nazwą aliasu). Generalnie używam jako aliasów jednoliterowych symboli (np. T, A), a Tobie chciałem tylko pokazać ideę aliasów.
> Niestety w efekcie otrzymuje tlumacza w miejscu autora i tłumacza (2x > tlumacz) :-( > Ale chyba wiem (nie do konca) gdzie robię błąd > Wynik zapytania wyswietlam w ten sposób: > while($wiersz=mysql_fetch_array ($wynik)) { > echo "".$wiersz['tytul']." autor:".$wiersz['imie']." > ".$wiersz['nazwisko']." > tlumacz:".$wiersz['imie']." ".$wiersz['nazwisko']."";} > logiczne ze pokaze mi te same dane autora i tlumacza. > Jak to inaczej zrobić?
Nie znam się na pehapie, ale przypuszczam, że jeśli w wyniku zapytania pojawiły się kolumny o takich samych nazwach, lecz z dwóch różnych tabel, to można je jakoś odróżnić. Hmm, zajrzałem do googlowinicy i znalazłem tam (http://pl.php.net/mysql_fetch_array, nie wiem na ile to aktualne): "mysql_fetch_array() jest rozszerzoną wersją mysql_fetch_row(). Oprócz zapisywania danych w indeksach numerycznych, zapisuje je też w indeksach przyporządkowujących (asocjacyjnych), używając nazw pól jako kluczy. Jeżeli dwie lub więcej kolumn wyniku ma te same nazwy, ostatnia kolumna będzie brana pod uwagę. Dostęp do innych kolumn o tej samej nazwie jest możliwy jedynie przez indeksowanie numeryczne lub przez stworzenie aliasa."
Tak więc musisz użyć aliasów także na poszczególne kolumny, czyli np.:
SELECT K.*, A.*, T.imie As T_Imie, T.nazwisko As T_Nazwisko FROM ksiazki As K LEFT JOIN osoby As Autorzy ON ksiazki.autor = Autorzy.id_os Left Join osoby As Tlumacze On ksiazki.tlumacz = Tlumacze.id_os
i potem while($wiersz=mysql_fetch_array ($wynik)) { echo "".$wiersz['tytul']." autor:".$wiersz['imie']." ".$wiersz['nazwisko']." tlumacz:".$wiersz['T_Imie']." ".$wiersz['T_Nazwisko']."";} -- Pozdrawiam Grzegorz
WojtekB - 30-03-2007 00:07
Grzegorz Danowski wrote:
> "WojtekB" <antyspam@spam.no> wrote in message > news:eu96ag$jt4$1@atlantis.news.tpi.pl... >> Spróbowałem jak proponowałeś jednak z małą modyfikacją bo założyłem ze >> pisząc Autorzy i Tlumacze miałeś na mysli autor i tlumacz, Wysmażyłem coś >> takiego: > .... > Ja bym unikał nadawania tabelom takich samych aliasów jak nazwy pól (u > Ciebie tłumacz jest nazwą pola a raz nazwą aliasu). Generalnie używam jako > aliasów jednoliterowych symboli (np. T, A), a Tobie chciałem tylko pokazać > ideę aliasów. > >> Niestety w efekcie otrzymuje tlumacza w miejscu autora i tłumacza (2x >> tlumacz) :-( >> Ale chyba wiem (nie do konca) gdzie robię błąd >> Wynik zapytania wyswietlam w ten sposób: >> while($wiersz=mysql_fetch_array ($wynik)) { >> echo "".$wiersz['tytul']." autor:".$wiersz['imie']." >> ".$wiersz['nazwisko']." >> tlumacz:".$wiersz['imie']." ".$wiersz['nazwisko']."";} >> logiczne ze pokaze mi te same dane autora i tlumacza. >> Jak to inaczej zrobić? > > Nie znam się na pehapie, ale przypuszczam, że jeśli w wyniku zapytania > pojawiły się kolumny o takich samych nazwach, lecz z dwóch różnych tabel, > to można je jakoś odróżnić. Hmm, zajrzałem do googlowinicy i znalazłem tam > (http://pl.php.net/mysql_fetch_array, nie wiem na ile to aktualne): > "mysql_fetch_array() jest rozszerzoną wersją mysql_fetch_row(). Oprócz > zapisywania danych w indeksach numerycznych, zapisuje je też w indeksach > przyporządkowujących (asocjacyjnych), używając nazw pól jako kluczy. > Jeżeli dwie lub więcej kolumn wyniku ma te same nazwy, ostatnia kolumna > będzie brana pod uwagę. Dostęp do innych kolumn o tej samej nazwie jest > możliwy jedynie przez indeksowanie numeryczne lub przez stworzenie > aliasa." > > Tak więc musisz użyć aliasów także na poszczególne kolumny, czyli np.: > > SELECT > K.*, A.*, > T.imie As T_Imie, > T.nazwisko As T_Nazwisko > FROM > ksiazki As K > LEFT JOIN > osoby As Autorzy > ON > ksiazki.autor = Autorzy.id_os > Left Join > osoby As Tlumacze > On > ksiazki.tlumacz = Tlumacze.id_os > > i potem > while($wiersz=mysql_fetch_array ($wynik)) { > echo "".$wiersz['tytul']." autor:".$wiersz['imie']." > ".$wiersz['nazwisko']." > tlumacz:".$wiersz['T_Imie']." ".$wiersz['T_Nazwisko']."";} > -- > Pozdrawiam > Grzegorz
Znalazłem wreszcie czas i po kilku(nastu) próbach udało mi się :-) Dzięki za pomoc.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MySQL] Wybierz tylko te rekordy z t1 =?ISO-8859-2?Q?kt=F3rych_?==?ISO-8859-2?Q?nie_ma_w_t2=2E_JOIN_=3F?=
[mysql, postgres] poprawne uzycie GROUP BY i JOIN
[MySql] pytanie o relacje, JOIN
Zapytanie na 3 tabele, JOIN itp.
dziwna sprawa z join w mysql 5.0
[sql]kolejność join'ów ma znaczenie?
wydajnosc wielokrotnych join'ów
[MySQL] zapytanie JOIN
[mysql] warunkowy inner join
JOIN i trzy tabelki
zanotowane.pldoc.pisz.plpdf.pisz.plmelooonka.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|