合并来自相同 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
我正在翻译 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