Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak to rozwiązac? (nawet nie wiem jak to zatytuowac)
Forum PHP.pl > Forum > Bazy danych > MySQL
livinghatret
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
ayeo
Witam!

Wystarczy zwykłe SELECT IF

Pozdrawiam!
phpion
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:
  1. SELECT id, COALESCE(name_pl, name_en) AS name FROM (tutaj TO podzapytanie) subquery

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 smile.gif
livinghatret
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.
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.