我已经构建了一个多语言应用程序。数据库看起来像:
表格事项
|id| img |url|
--------------
|1 | | |
|2 | | |
|3 | | |
表thing_translations
|id| thing_id | title | locale |
---------------------------------
|1 | 1 | | en |
|2 | 2 | | en |
|3 | 3 | | en |
|4 | 2 | | ru |
我的英语默认语言(locale = en)。
当我从title
以英语以外的其他语言获得翻译things_translations
时,数据库中还没有这种语言,我想获得它的英文版本。
我尝试了以下查询,但改为返回所有记录:
select things.id
FROM things
INNER JOIN things_translations ON things.id = things_translations.thing_id
WHERE CASE WHEN things_translations.locale = ru IS NULL
THEN things_translations.locale = en END
通过上述查询,我获得了thing_id:2
的两种语言,但我只想获得ru locale
而不是en
因为存在。
答案 0 :(得分:1)
我正在使用相同类型的应用程序并用CASE解决我的问题:
SELECT t.id FROM things t
INNER JOIN things_translations tt ON t.id = tt.thing_id
AND tt.locale = CASE WHEN
EXISTS(SELECT tte.locale FROM things_translations tte WHERE tt.thing_id = t.id AND tte.locale = 'ru') THEN 'ru'
ELSE 'en'
END
答案 1 :(得分:1)
SELECT IFNULL(TT1.title,TT.title)
FROM things T
LEFT JOIN things_translations TT
ON (T.id = TT.thing_id AND TT.locale = 'en')
LEFT JOIN things_translations TT1
ON (T.id = TT1.thing_id AND TT1.locale = 'ru')
WHERE T.id = 2;
答案 2 :(得分:0)
我认为你的CASE
正在评估为真,因此显示了所有内容。
您可以加入things_translations两次 - 一次使用您选择的语言,一次使用英语,在相应的条款中。然后您的列将为COALESCE(things_translations.title, things_translations_en.title)
。换句话说,尝试使用标题的things_translations(您选择的语言连接),如果它为空,请使用things_translations_en中的标题。你还需要在where子句中使用两个连接来实现这两个连接。 ID相等,否则您将获得太多行。