2012-09-12 92 views
3

我有簡單的數據庫表中的一個名爲類別:MySQL的SELECT + LEFT JOIN + IF查詢

category.id category.name category.lang 
1   'apple'  'en' 
1   'manzana'  'es' 
1   ''   'de' 
1   ''   'it' 

變量:

$default_lang = 'en'; 
$current_lang = 'it'; 

我想提出的查詢,根據$返回CATEGORY_NAME場current_lang,但如果category.name是空的,則應該使用category.name從$ default_lang這樣的:

SELECT * FROM cat_list 
    LEFT JOIN category ON cal_list.id = category.id 
      AND IF(category.name = $current_lang = '', $default_lang, 'No Lang') 

普萊斯Ë讓我知道,我如何解決這個查詢,使其工作?

===

好了,現在我有一個好主意:

SELECT * FROM cat_list LEFT JOIN category 
      ON cal_list.id = category.id 
      AND category_lang IN ($curreng_lang, $default_lang) 
      AND category_name <> '' 

它工作正常,但我要的情況下,擔心「IN」命令,如果這兩種語言有名稱值?

回答

2
SELECT catname= 
CASE name 
     WHEN '' THEN (select name from Category where lang=$default_lang limit 1) 
     ELSE name 
     END 
FROM Category where id=$current_lang 

釋: 這裏查詢使用情況語句select語句內的, 其中 外查詢使用情況 「ID = $ current_lang」

所以在select語句將有名稱= '',所以

catname= 
    CASE name 
      WHEN '' THEN (select name from Category where lang=$default_lang limit 1) 
      ELSE name 
      END 

名稱「」,用時應該執行 這裏,所以第一個條件,將執行查詢

返回 名蘋果(因爲語言是「恩」)(選擇從範疇其中lang = $ default_lang限1名) 以及將sotred到catname變量。這將返回結果

如果它將獲得與名稱第一次(id = $ current_lang)的值,它將與它一起返回。

+1

請詳細說明更使用戶可以更容易明白只有代碼的答案是不回答 –

+0

Patriks一個很好的方法,它可以實現它而不選擇在SELECT?因爲表類別有大約80萬行:( –

2

是在category.nameNULL空字符串

如果NULL,用COALESCE返回列表中的第一個非NULL值)

SELECT category.id, 
     COALESCE(category.name, $default_lang) name, 
     COALESCE(category.lang, $current_lang) lang 
FROM cat_list 
    LEFT JOIN category 
      ON cal_list.id = category.id 

如果空字符串,使用IF

SELECT category.id, 
     IF(category.name = '', $default_lang,category.name) name, 
     IF(category.lang = '', $current_lang,category.lang) lang 
FROM cat_list 
    LEFT JOIN category 
      ON cal_list.id = category.id 
+0

我使用空字符串,但是:IF(category.name ='',$ default_lang,category.name)name,這將只返回'en'($ default_lang)'name '字段在category.name <>''的情況下? –

+0

@ user1664869如果不是null或空字符串,將會顯示'category.name'。 –

+0

Johnny,您認爲如果讓它變成這樣:SELECT * FROM cat_list LEFT JOIN類別ON cal_list.id = category.id AND category_lang IN($ curreng_lang,$ default_lang)? –

0

user1664869, 那這個呢?

SELECT catname=CASE c1.name 
     WHEN '' THEN c2.name 
     ELSE c1.name 
     END 
FROM 
Category c1 
INNER JOIN Category c2 ON c1.lang=$current_lang and c2.lang=$default_lang;