![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 22.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie,
Mam specyficzny problem do rozwiązania z selectem. Co prawda rozwiązałem go w całkiem sprawnie działający sposób w PHP, jednak sposób ten zaczyna się komplikowac, gdy chcę zrobic filtrowanie danych. Mam dwie tabele: Tabela 1: Zawiera ID obiektu oraz kilka dodatkowych informacji; Tabela 2: Zawiera nazwy i opisy obiektów w różnych językach, powiązane z ID w tabeli 1. Wszystko byłoby proste, lecz nie chodzi mi o zwykłego join'a, lecz o taką sytuację: Każdy obiekt MUSI miec profil w języku angielskim, a dodatkowo MOŻE w innym języku. Jeśli na stronie ustawiony jest angielski, sprawa jest prosta - po prostu robię to zwykłym selectem z join'em. Sprawa się komplikuje, gdy na stronie będzie ustawiony polski. W takiej sytuacji chciałbym by wyglądało to tak: 1. Jeśli istnieje profil w j.polskim - wyświetl go; 2. Jeśli nie było profilu w j.polskim - wyświetl angielski. Czy ktoś ma jakiś pomysł, jak w mysql'u zrobic zapytanie/procedurę, która zwróci mi jednolity wynik utworzony wg. tych reguł? Pozdr Ten post edytował livinghatret 21.01.2010, 22:56:49 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Wystarczy zwykłe SELECT IF Pozdrawiam! -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Ja bym to zrobił z podzapytaniem. W podzapytaniu wybierasz dane dla aktualnej wersji językowej oraz dla domyślnej wersji językowej (tabelę dla aktualnej wersji językowej dołączasz poprzez LEFT JOIN aby umożliwić dołączanie wartości NULL). W wyniku tego otrzymujesz np.
Kod id | name_pl | name_en ---------------------- 1 | pies | dog 2 | NULL | cat Następnie w zapytaniu głównym wybierasz dane mniej więcej w ten sposób:
co zwróci: Kod id | name --------- 1 | pies 2 | cat Kluczem jest tutaj użycie funkcji COALESCE, która zwróci pierwszą wartość spośród przekazanych, która nie będzie NULLem. // Edit: Chyba można to zrobić bez podzapytania tylko w tym głównym wstawić COALESCE ![]() Ten post edytował phpion 22.01.2010, 08:42:21 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 22.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za nakierowanie.
Mam jednak jeszcze pytanie: co, jeśli struktura tabel z opisami jest taka: id, id_obiektu (klucz obcy), id_języka, obiect_name Wtedy mamy: 1,1,0,Obiect 1 Name 2,1,1,Nazwa Obiektu 1 3,2,0,Obiect 2 Name 4,3,0,Obiect 3 Name Jak do tego zrobić podzapytanie, by zwróciło mi kolejne rekordy jako kolumny? Problem rozwiązany. Poradziłem sobie stosując zapytanie z podzapytaniem skorelowanym i dołączając brakującą częśc danych przez union. To wszystko wrzuciłem do widoku i teraz mogę sobie robic filtrowanie i sortowane, jakie mi się żywnie podoba. Ten post edytował livinghatret 22.01.2010, 11:31:33 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 21.06.2025 - 05:46 |