Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak to rozwiązac? (nawet nie wiem jak to zatytuowac)
livinghatret
post 21.01.2010, 22:56:15
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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
ayeo
post 22.01.2010, 00:12:22
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!


--------------------
Go to the top of the page
+Quote Post
phpion
post 22.01.2010, 08:38:19
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:
  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

Ten post edytował phpion 22.01.2010, 08:42:21
Go to the top of the page
+Quote Post
livinghatret
post 23.01.2010, 11:10:33
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
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 21.06.2025 - 21:33