如果一条记录不存在则选择另一条记录

时间:2016-08-23 09:16:56

标签: mysql sql

我已经构建了一个多语言应用程序。数据库看起来像:

表格事项

|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因为存在。

3 个答案:

答案 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;
  

SQL Demo

答案 2 :(得分:0)

我认为你的CASE正在评估为真,因此显示了所有内容。

您可以加入things_translations两次 - 一次使用您选择的语言,一次使用英语,在相应的条款中。然后您的列将为COALESCE(things_translations.title, things_translations_en.title)。换句话说,尝试使用标题的things_translations(您选择的语言连接),如果它为空,请使用things_translations_en中的标题。你还需要在where子句中使用两个连接来实现这两个连接。 ID相等,否则您将获得太多行。