2014-04-10 34 views
0

我有一個帶子查詢的查詢來獲取翻譯文本,但where子句不工作...
始終返回文本提供美式英語,因爲它是在DB的第一,即使其他語言

我該怎麼做才能尊重查詢所陳述的順序(語言=「美式英文」或國際化=「美式英文」)
首先ptbr else或enus

翻譯內容使用哪裏有2種語言的順序(language =「enus」或i18n =「enus」)

[翻譯]

key | language | text 
1 | enus  | foo in enus 
1 | ptbr  | foo in ptbr 
1 | it  | foo in it 



[查詢]

select 
    A.*, 
    (select text from translate where key = A.key and (language = "ptbr" or i18n = "enus") limit 1) `translate` 
from table as A 
where A.id = 1 

回答

1

使用多個LEFT JOIN條款。

SELECT a.*, IFNULL(p.text, e.text) AS text 
FROM table AS a 
LEFT JOIN translate AS p ON p.key = a.key AND p.language = 'ptbr' 
LEFT JOIN translate AS e ON e.key = a.key AND e.i18n = 'enus' 

,將做你想做的子查詢:

SELECT text 
FROM (SELECT 1 AS priority, text 
     FROM translate 
     WHERE key = A.key 
     AND language = 'ptbr' 
     UNION 
     SELECT 2 AS priority, text 
     FROM translate 
     WHERE key = A.key 
     AND i18n = 'enus') x 
ORDER BY priority 
LIMIT 1 

或者你可以這樣做:

SELECT text 
FROM translate 
WHERE key = A.key 
AND (language = "ptbr" or i18n = "enus") 
ORDER BY language = "ptbr" DESC 
LIMIT 1 

的普遍觀點是,如果你想LIMIT 1返回優選排,您需要使用ORDER BY以確保該行在結果中處於第一位。

+0

我需要在子查詢中。有可能嗎? –

+0

好吧,我已經展示瞭如何編寫你的子查詢,以便它能夠滿足你的需求。我不知道爲什麼你需要這樣做,但如果它讓你快樂...... – Barmar

+0

謝謝,我現在正在測試...我有幾個領域,主表已經有其他關係,我認爲子查詢最適合我,我是初學者 –