Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Obsługa wielu języków w katalogu - problem z LEFT JOIN
Nortonek
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 29.11.2003

Ostrzeżenie: (0%)
-----


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 ...

Ten post edytował Nortonek 6.06.2007, 21:35:26
Go to the top of the page
+Quote Post
SongoQ
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Sprawdz skladnie LEFT JOINa. (ON)
Go to the top of the page
+Quote Post
Nortonek
post
Post #3





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 29.11.2003

Ostrzeżenie: (0%)
-----


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ż.
Go to the top of the page
+Quote Post
cicik
post
Post #4





Grupa: Zarejestrowani
Postów: 219
Pomógł: 5
Dołączył: 18.07.2006
Skąd: Piekary Śląskie

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Nortonek
post
Post #5





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 29.11.2003

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
zimi
post
Post #6





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----


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

Ten post edytował zimi 13.06.2007, 11:44:32
Go to the top of the page
+Quote Post
Nortonek
post
Post #7





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 29.11.2003

Ostrzeżenie: (0%)
-----


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)){ ...
Go to the top of the page
+Quote Post
zimi
post
Post #8





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 16:36