2011-08-27 116 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