2012-12-11 14 views
8

Mam dwie tabelę z tej strukturymysql przyłączyć się stanie

categories 
-------------------------------- 
id | create 
1 | 2012-12-01 12:00:00 
2 | 2012-12-01 12:00:00 

category_i18ns 
-------------------------------- 
category_id  | lang | title 
1    | en | home page 
1    | de | HomE PAGEa 
1    | fa | خانه 
2    | en | about 

niektóre kategorie mają wszystkie dane języków i jakiś inny havnt. na przykład kategoria id 2 po prostu ma przetłumaczony tytuł en. chcę mieć zapytanie, które najpierw sprawdza bieżący język do pobrania tytułu, a jeśli nie istnieje, to pokaż inne.

Mam zapytanie, aby uzyskać dane kategorii bieżącej z danymi i18n w tym bieżącym przykładzie de jest językiem domyślnym. dla kategorii id 1 mamy tytuł de, ale dla kategorii 2 nie mamy. więc chcę english version jak tytuł kategorii

SELECT * FROM `mhf_swe_ndzhmju3_test`.`categories` AS `Category` 
LEFT JOIN `mhf_swe_ndzhmju3_test`.`category_i18ns` AS `CategoryLocale` ON (
`CategoryLocale`.`category_id` = `Category`.`id` 
AND `CategoryLocale`.`lang` = 'de') 

pragnienie obecnie wprowadzone do 'de' języka

Category.id  CategoryLocale.title CategoryLocale.lang 
1    HomE PAGEa    de 
2    about     en 
+0

Jeśli masz "en" i "fa" dla kategorii 2, ale nie masz "de", który język musisz wybrać? –

+0

Czy możesz podać właściwą wydajność, której oczekujesz? – Subodh

+0

@HamletHakobyan nie ważne. Najpierw dodano dane wyjściowe dotyczące mysql serverd – sweb

Odpowiedz

13
SELECT Category.id, 
     COALESCE(a.lang, b.lang) lang, 
     COALESCE(a.title, b.title) title 
FROM categories AS Category 
     LEFT JOIN category_i18ns AS a 
      ON a.category_id = Category.id AND a.lang = 'de' 
     LEFT JOIN category_i18ns AS b 
      ON b.category_id = Category.id AND b.lang = 'en' 
+0

jeśli nie wiemy, który język został dodany do kategorii specjalnej? jak mogę je odzyskać. na przykład identyfikator kategorii 3 dodany tylko za pośrednictwem języka 'fr' i nie ma żadnego innego języka – sweb

+0

Czy nie zakładasz tutaj, że będziesz miał wpis" en "we wszystkich kategoriach? – Subodh

+0

@st_stantial nope .. nie ma większego domyślnego języka dla wszystkich kategorii. – sweb

1

w porządku, to nie jest najlepszy rozwiązanie, ale myślę, że powinno działać dobrze:

SELECT * FROM categories c INNER JOIN category_i18ns t1 
ON c.id = t1.category_id AND t1.lang = 'de' 

UNION 

SELECT * FROM categories c LEFT JOIN category_i18ns t2 
ON c.id = t2.category_id and t2.lang != 'de' 
WHERE t2.category_id not in 
    (SELECT DISTINCT category_id FROM category_i18ns WHERE lang = 'de') 
GROUP BY c.id 

SQL Fiddle Example

2

Jeśli masz kolejności preferencji, lewo dołączyć wszystkie języki i umieścić je łączyć w kolejności preferencji:

SELECT Category.id, 
    COALESCE(a.lang, b.lang, c.lang, d.lang) lang, 
    COALESCE(a.title, b.title, c.title, d.title) title 
FROM categories AS Category 
    LEFT JOIN category_i18ns AS a 
     ON a.category_id = Category.id AND a.lang = 'de' 
    LEFT JOIN category_i18ns AS b 
     ON b.category_id = Category.id AND b.lang = 'en' 
    LEFT JOIN category_i18ns AS c 
     ON c.category_id = Category.id AND c.lang = 'fr' 
    LEFT JOIN category_i18ns AS d 
     ON d.category_id = Category.id AND d.lang = 'es'; 

Jeśli chcesz uzyskać tekstu z język losowe, używać tej kwerendy:

SELECT Category.id, 
     COALESCE(a.lang, b.lang) lang, 
     COALESCE(a.title, b.title) title 
FROM categories AS Category 
     LEFT JOIN category_i18ns AS a 
      ON a.category_id = Category.id AND a.lang = 'de' 
     LEFT JOIN category_i18ns AS b 
      ON b.category_id = Category.id 
GROUP BY Category.id 

http://sqlfiddle.com/#!2/2beaf/5

Powiązane problemy