Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobranie innego rekordu kiedy nie ma złączenia po LEFT JOIN
Forum PHP.pl > Forum > Bazy danych > MySQL
maniutek08
Witam

Mam trzy tabele z językami, głównymi rekordami "menu" oraz tabela z tłumaczeniami pozycji w menu :

tabela menu :
[id_menu]
1
2
3

tabela lang :
1 - polski
2 - angielski

tabela menu_lang :
[id_menu][id_lang][translation_name]
1 1 Strona główna
1 2 Home
2 1 Nasza oferta

Za pomocą LEFT JOIN mogę pobrać odpowiednie tłumacznie, ale chciałbym uzyskać coś takiego, że jeżeli LEFT JOIN nie znajdzie tłumaczenia to weźnie inny rekord[np.: tłumaczenie po polsku]

  1. SELECT * FROM menu LEFT JOIN menu_lang ON menu.id_menu = menu_lang.id_menu && menu_lang.id_lang = 2

I teraz chciałbym że jak nie znajdzie tłumaczenia to wybierze rekord menu_lang.id_lang = 1
trueblue
Wybierz rekordy spełniające id_lang IN(1,2), potem ORDER BY DESC LIMIT 0,1.
Oczywiście zamiast 2, id wybranego języka.

Zamiast LEFT JOIN, INNER JOIN lub WHERE.

EDIT: W menu dla danego lang masz jeden rekord czy wiele? Jeśli wiele, to moje rozwiązanie tu nie pasuje.
maniutek08
Ale LIMIT I ORDER BY nie działają mi przy ON

Nie wiem czy się dobrze zrozumieliśmy, ale ja chce pobrać wszystkie pozycje z tabeli MENU z tłumaczeniem po angielsku, jeśli tłumaczenia angielskiego nie znaleziono to wybiera polskie..
nospor
daj dwa left join na menu_lang, jedno na en, drugie na pl, a potem sobie w php obrabiaj jak nie ma en to bierz to co sie dolaczylo w pl
maniutek08
Naprawdę tego nie da rady w MYSQL zrobićquestionmark.gif W php wolałbym nie, bo w wielu miejscach bym musiał robić modyfikacje
trueblue
W przypadku braku choć jednego rekordu z tłumaczeniem, ma podstawić tłumaczenie pl dla całego menu, czy dla tego brakującego rekordu?
maniutek08
Dla brakującego tylko
mmmmmmm
Przecież @nospor napisał tu: http://forum.php.pl/index.php?showtopic=24...t&p=1174877 jak masz to zrobić...
  1. SELECT *, Coalesce(e.translation_name, p.translation_name) FROM menu m LEFT JOIN menu_lang e ON m.id_menu = e.id_menu AND e.id_lang = 2 LEFT JOIN menu_lang p ON m.id_menu = p.id_menu AND p.id_lang = 1

maniutek08
Cytat(mmmmmmm @ 28.10.2015, 08:33:15 ) *
Przecież @nospor napisał tu: http://forum.php.pl/index.php?showtopic=24...t&p=1174877 jak masz to zrobić...
  1. SELECT *, Coalesce(e.translation_name, p.translation_name) FROM menu m LEFT JOIN menu_lang e ON m.id_menu = e.id_menu AND e.id_lang = 2 LEFT JOIN menu_lang p ON m.id_menu = p.id_menu AND p.id_lang = 1


w tym przypadku zawsze pobiera mi polskie tłumaczenia, nawet bez COALESCE zwraca mi tylko polskie tłumczenia
mmmmmmm
Cytat(maniutek08 @ 28.10.2015, 08:58:46 ) *
w tym przypadku zawsze pobiera mi polskie tłumaczenia, nawet bez COALESCE zwraca mi tylko polskie tłumczenia

Głupoty gadasz:
http://sqlfiddle.com/#!9/b301c0/1
maniutek08
Chciałbym.. widzę w przykłądzie co podałeś, że to jest to oco mi chodzi ale za chiny u mnie coś nie działa.. może gdzieś błąd zrobiłem :

  1. "SELECT *, COALESCE(e.pagetranslation_name, p.pagetranslation_name) FROM pages m
  2. LEFT JOIN pagetranslations e ON m.page_ID = e.pagetranslation_page_ID && e.pagetranslation_language_ID = ".$_GET['language_ID']."
  3. LEFT JOIN pagetranslations p ON m.page_ID = p.pagetranslation_page_ID && p.pagetranslation_language_ID = 1
  4. WHERE page_nstree_ID = '".$_GET['page_nstree_ID']."' "


$_GET['language_ID'] = 2
nospor
zobacz jakie dokladnie wartosci ci to zwraca. Bo ty moze zamiast NULL masz pusty text w tlumaczeniu, a to zasadnicza roznica
maniutek08
No to zwrócił by mi jedno tłumaczenie angielskie i jedno puste.. a ono mi zwraca tylko polskie ;/
nospor
Wez poprostu ppokaz DOKLADNIE co ci zwraca.... czy to taki problem? Pokaz dokladnie CALE REKORDY jakie dostajesz
maniutek08
ah.. przepraszam nie wyświetlałem sobie wyniku COALESCE() tylko kolumnę pagetranslation_name.. dzięki wszystko gra
nospor
Chcialem ci to wczesniej napisac, ale po namysle stwierdzilem ze az tak nierozgarniety to na pewno nie jestes... a tu zonk tongue.gif
maniutek08
NO jednak nierozgarnięty wink.gif Ale wiesz jak jest.. możesz patrzeć godzinami na ten sam kod i nie widzieć błędu, a ktoś podejdzie i od razu go zobaczy...
Dzięki jeszcze raz za pomoc
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.