我有一个多语言的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
答案 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
个查询
你可以添加一个真实的例子,我会调整我的答案来匹配它。