合并来自相同 table 的 2 个字段?

Merge 2 fields from same table?

我正在翻译 table。我想合并翻译,以便我有另一种语言的后备。

tbl `cms`
+----+-------+--------+
| id | other | other1 |
+----+-------+--------+
|  1 | na    | na     |
|  2 | na    | na     |
+----+-------+--------+

tbl `translations`
+--------+--------+-------------+--------+
| cms_id | locale |     key     | value  |
+--------+--------+-------------+--------+
|      1 | en     | title       | Coffee |
|      1 | pl     | title       | Kawa   |
|      2 | en     | description | Black  |
|      2 | pl     | description |        |
+--------+--------+-------------+--------+

在此示例中,如果用户使用的是波兰语,由于当前 description 字段没有条目,我想输出英语 "Black".

SELECT * 
FROM cms
LEFT JOIN translations t_en ON cms.id = t_en.cms_id AND locale = 'en'
LEFT JOIN translations t_pl ON cms.id = t_pl.cms_id AND locale = 'pl'
FROM translations

现在我想从联接中合并 translations.value 字段,我可以通过合并来实现吗?或者有我可以使用的 JOIN 方法吗?

SELECT 
t_en.value
UNION
t_pl.value
FROM cms
LEFT JOIN translations t_en ON cms.id = t_en.cms_id AND locale = 'en'
LEFT JOIN translations t_pl ON cms.id = t_pl.cms_id AND locale = 'pl'
FROM translations

您可以使用连接方法。您可能希望在 SELECT 中使用 COALESCE()。如果你想优先考虑 Polist 值,那么把它放在 COALESCE():

的第一位
SELECT cms.id, COALESCE(t_pl.value, t_en.value)
FROM cms LEFT JOIN
     translations t_en
     ON cms.id = t_en.cms_id AND t_en.locale = 'en' LEFT JOIN
     translations t_pl
     ON cms.id = t_pl.cms_id AND t_pl.locale = 'pl';

我应该注意 COALESCE() returns 参数列表中的第一个 non-NULL 值,因此您可以根据需要添加其他语言。

在您的示例中,您应该使用 CASE 语句

SELECT 
    CASE 
        WHEN t_pl.value IS NOT NULL AND t_pl.value != '' THEN t_pl.value 
        ELSE t_en.value
    END AS value

FROM cms
LEFT JOIN translations t_en ON cms.id = t_en.cms_id AND locale = 'en'
LEFT JOIN translations t_pl ON cms.id = t_pl.cms_id AND locale = 'pl'
FROM translations