2012-01-23 55 views
0

我有兩個表:MySQL加入null?

產品:

id | sku 
0 P323 
1 K534 

翻譯:

現在,我需要顯示斯洛文尼亞(SL)的翻譯,但如果它不存在,則應該顯示英文。

我正在尋找一種方式來獲取產品,該結果如下:

id | sku | name 
0 P323 Nek izdelek 
1 K534 Some other product 

這可能與MySQL的,使用單個查詢?

注意:轉換表中的條目可能不存在或不存在,但所有值(除外鍵)都可能爲空。

根據要求編輯: 我需要一個選項,讓特權後端用戶創建儘可能多的文本字段,就像電子商店需要它們進行產品展示一樣(例如簡短描述,包裝內容,保修信息...)。因此,我寧願不將列名硬編碼到SQL查詢中,因爲這會降低可移植性。
我需要選擇所有翻譯字段而不指定列名,如「translation。*」中所示。
如果沒有找到切實可行的解決方案,我會求助於維護自定義列的記錄,這些列是在查詢建立時(在執行之前)添加的。

回答

5

如果兩個翻譯是缺少的名字顯示爲NULL

SELECT p.id, sku, IFNULL(tr.name,en.name) as name 
FROM product p 
LEFT JOIN translation en ON p.id = en.product_id and en.lang = 'en' 
LEFT JOIN translation tr ON p.id = tr.product_id and tr.lang = 'sl' 

也看到文檔的IFNULL

或與COALESCE更好perfromance

SELECT p.id, sku, COALESCE(tr.name,en.name) as name 
FROM product p 
LEFT JOIN translation en ON p.id = en.product_id and en.lang = 'en' 
LEFT JOIN translation tr ON p.id = tr.product_id and tr.lang = 'sl' 
+2

['coalesce'](HTTP ://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#function_coalesce)比'isnull'更好。 –

+0

@ muistooshort對於兩個字段,不'IFNULL'工作是否一樣? – xdazz

+0

你對性能是對的,但'ifnull'更易於閱讀,並且更易於理解 – rauschen