SQL查询中的流控制/条件(CASE)

时间:2016-05-22 18:32:23

标签: mysql sql

我有一个多语言的CMS。整个系统中使用的大约300个单词和短语在用户更改所选语言时会发生变化。英语是默认语言。在任何给定的点上,其他语言都可能没有被完全翻译。我希望英文版本能够根据具体情况进行回退,其中特定的单词或短语尚未翻译成所选语言。 (堆栈溢出不允许表html标记,因此我将使用无序列表显示两条记录)

language_id label         translation
en          your_account  Your Account
zh          your_account  您的賬戶

主键位于language_id和标签

我在MariaDB上使用PDO。我坚持的查询部分是if / case语句,我知道下面是完全错误的,但它证明了我希望实现的目标:

SELECT translation_result 
FROM (SELECT translation as translation_result FROM languages WHERE
label='your_account' AND language_id = 'zh')A
CASE  A.translation_result IS NOT NULL ELSE
(SELECT translation as translation_result FROM languages WHERE
label='your_account' AND language_id = 'en')B

1 个答案:

答案 0 :(得分:0)

这就是我要做的事情:

SELECT (IFNULL(ZH.translation, EN.translation)) AS translation_result
FROM languages EN 
LEFT JOIN languages ZH ON EN.label=ZH.label AND ZH.language_id = 'zh'
WHERE EN.label='your_account' 
  AND EN.language_id = 'en'

由于英语是主语言并且总是填充,因此您可以在英语记录上进行基本查询,这些记录总会返回一些内容。从英语返回的内容来看,你在同一张桌子上制作一个LEFT JOIN,用于相同的标签,但语言不同。如果JOIN匹配某些内容(您没有NULL),则使用此值

但我认为您展示的查询不是一个好例子,因为它不代表您在语言表中的最终查询将在应用程序中。通常你应该让你的主人#34;查询其他表,并按照用户的语言在LEFT JOIN表上添加language个查询 你可以添加一个真实的例子,我会调整我的答案来匹配它。