Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obsługa wielu języków w katalogu - problem z LEFT JOIN
Forum PHP.pl > Forum > PHP
Nortonek
Witam

Buduję sobie system do obsługi kilku języków mam takie struktury tabel

tabela: jezyk (id_lang, nazwa_jezyka) - tablica z dostępnymi językami
tabela: kategorie (id_cat, nazwa_kategorii) - tablica z przypisaniem pierwszej nazwy w domyślnym języku
tabela: kat_jezyki (id_cj, id_cat, id_lang, nazwa_cat) - tablica z kategoriami w innych językach

W tabelach mam przypisane przykładowe dane:
dla jezyk:
1|polski
2|angielski

dla kategorie:
1|książki
2|AGD

dla kat_jezyki:
1|1|1|książki - (kategoria 1 w j. polskim)
2|1|2|books - (kategoria 1 w j. angielskim)
3|2|1|AGD - (kategoria 2 w j. polskim)

Listuję sobie dla konkretnej kategorii $id_kategorii listę przypisanych języków za pomocą

$id_kategorii = '1';

  1. "SELECT J.id_lang, C.nazwa_kategorii FROM jezyk AS J LEFT JOIN kat_jezyki AS C USING(id_lang) WHERE C.id_cat='$id_kategorii'"


daje mi to wynik : książki | books

ale niestety już dla $id_kategorii = '1';

wynik będzie tylko: AGD i koniec wyników nie ma nawet pustego rekordu

Mi chodzi aby to zapytanie zwróciło pusty rekord dla 2 języka (2 rekordy),
czyli aby zwróciło że język 1 to AGD a jezyk 2 to "pusty rekord"

problem prawdopodobnie jest z tym że z góry szukam tylko rekordów odpowiadających C.id_cat='$id_kategorii'

no ale nie mogę się tego pozbyć bo właśnie chcę dane dla konkretnej kategorii.

Kombinowałem z zapytaniami INNER JOIN, RIGHT JOIN ale nie mogę zrobić tak aby wstawiło pusty rekord

dla kat_jezyk:
4|2|2|AGD - tego rekordu brakuje w bazie nie jest wpisany i chcę zapytaniem go uzyskać jako NULL dla
(kategoria 2 w j. angielskim)

podpowiedzcie jak sformułować zapytanie SQL, bo męczę się z tym trochę i powielam już swoje błędy i nie wychodzi mi ...
SongoQ
Sprawdz skladnie LEFT JOINa. (ON)
Nortonek
Tak jak napisałem kombinowałem z wszystkimi zapytaniami różne kombinacje.

Mam to rozwiązane w ten sposób że najpierw robie SELECT jezyki co daje mi 2 kolumny

a następnie robie SELECT kat_jezyk w danej kolumnie dla konkretnej kategorii i to mi daje zawsze zamierzony wynik.

Jednak chciałem to połączyć 1 zapytaniem tylko ten problem ze jeśli w kat_jezyki nie ma 1 wartości to nie otrzymuję null tylko 1 pole.

Chodzi o to aby dodało to drugie brakujące pole też.
cicik
Twoje zapytanie nie wyświetla języków bez przyporządkowanej kategorii ponieważ w where masz fraze która ogranicza wyniki do konkretnego kat_id, stąd wszystkie nulle są wywalane.
Nortonek
No dokładnie to jest ten problem nie pobiera bo jest null,
a teraz chciałem to obejść w 1 zapytaniu aby trochę to zoptymalizować ale nie mam już pomysłów.

Czy wiesz może jak zrobić WARUNEK aby jednak pobrało 3 języki nawet jeśli nie ma dowolnego z języków i do niego przypisanej kategorii to dało mu null ?
zimi
sugeruję tabele kategorie, gdzie w where dajesz warunek co do kategorii, złożyć z tabelą języki a następnie z tabelą kat_jezyki i powinno być dobrze, jak nie to wrzuć SQL tabel i kolejnych wierszy (bo samemu nie chce mi się ich robić) to topicu bądź do mnie na PW

ale jednego nie rozumiem (chyba mam braki ;/)
Kod
LEFT JOIN kat_jezyki AS C USING(id_lang)

skąd Ci się wzięło USING? jakoś nie znam tego, a w dokumentacji MySQL też nie znalazłem, używasz innej bazy?

EDIT: znalazłem
Nortonek
aktualnie aby pobrać kategorie, nawet te puste dla każdego języka robię to tak

  1. $QUERY_lang=mysql_query("SELECT id_lang FROM $table_lang ORDER BY id_lang ASC");
  2. while($ROW_lang=mysql_fetch_array($QUERY_lang)){
  3. $id_lang = $ROW_lang['id_lang'];
  4. $nazwa=mysql_fetch_array(mysql_query("SELECT nazwa FROM $table_cat_lang WHERE id_cat='$id_cat' AND id_lang='$id_lang'"));
  5. echo 'wartość dla jezyka '.$id_lang.'. nazwa:'.$nazwa[0].'<BR>';
  6. }


kombinowałem tak jak napisałem na początku z łączeniem tego w 1 zapytanie ale pomija nieistniejącą kategorię dla języka

  1. $QUERY_lang=mysql_query("SELECT L.id_lang, C.nazwa FROM $table_lang AS L LEFT JOIN $table_cat_lang AS C USING(id_lang) WHERE C.id_cat='$id_cat' ORDER BY L.id_lang ASC");
  2.  
  3. while($ROW_lang=mysql_fetch_array($QUERY_lang)){ ...
zimi
powrzucaj jeszcze kilka zmiennych do zapytania... będzie łatwiej, poza tym prosiłem Ciebie o kody tabel sql żebym sam nie musiał ich robić... takie lenistwo... no ale cóż
a ten kod z zapytaniem w pętli.... zostawię bez komentarza
wiesz czym się różni WHERE od JOIN-ów? tym że JOIN-y zostawiają NULL-e i nie używaj tego USING, w dokumentacji piątki go nie znalazłem więc chyba wychodzi z użycia i jest mniej użyteczny
Kod
SELECT * FROM jezyk j LEFT JOIN kat_jezyki kj ON j.id=kj.id_jezyk AND kj.id_kat=2
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.