![]() |
![]() ![]() |
![]() |
![]()
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';
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 |
|
|
![]()
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)
|
|
|
![]()
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ż. |
|
|
![]()
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.
|
|
|
![]()
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 ? |
|
|
![]()
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 |
|
|
![]()
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
kombinowałem tak jak napisałem na początku z łączeniem tego w 1 zapytanie ale pomija nieistniejącą kategorię dla języka
|
|
|
![]()
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
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 16:36 |