2011-08-27 173 views
1

我有一個帶翻譯的MySQL表。現在我正在尋找返回我的第一次翻譯匹配的語言給定的列表中查詢:翻譯查詢

比方說,有4名翻譯字符串可供選擇:

id   lang  translation 
-------------------------------- 
greeting en  hey! 
greeting de  Hallo. 
greeting de_at Servus! 
greeting de_ch Grüezi 

取決於查詢所需的結果給定的語言列表:

language list result 
----------------------- 
de,en   Hallo. 
en,de   hey! 
de_at,de,en  Servus! 

這可能在一個單一的查詢?

回答

1
SELECT COALESCE(de_at.translation, de.translation, en.translation) 
    FROM (SELECT 'greeting' AS id) AS id 
    LEFT JOIN translations AS de_at ON(de_at.lang = 'de_at' AND id.id = de_at.id) 
    LEFT JOIN translations AS de ON(de.lang = 'de' AND id.id = de.id) 
    LEFT JOIN translations AS en ON(en.lang = 'en' AND id.id = en.id) 

我應該歸功於Eddy這種技術。

+0

這個解決方案比脈衝星解決方案有什麼優勢嗎? – stofl

+0

pulsar的查詢將無法使用索引,因爲它在WHERE子句中使用了'IN()',所以對於每個詞組轉換,它必須執行全表掃描,考慮到最有可能您將在你的應用程序將是一個巨大的開銷。 – nobody

+0

也很少修改,你將能夠從數據庫中獲取多個翻譯與一個單一的查詢,這將進一步加快速度,這是不可能與脈衝星的解決方案。 – nobody

1

試試這個:

SELECT * FROM translations t WHERE id = 'greeting' AND lang IN ('de_at', 'de', 'en') ORDER BY FIELD(lang, 'de_at', 'de', 'en') LIMIT 1 
+0

完美的作品!謝謝! – stofl