SQL 用另一个 table 的内容替换字段内容(如果找到)
SQL to replace field content with content from another table if found
考虑以下 table 多语言事件数据库
events
id, title, content, ...
localizations
id, table_name, row_id, field, language, text
我的 CMS 所做的是在本地化翻译存储的情况下 table。
检索事件时,字段会被相应语言的本地化文本覆盖。
因此例如:
events
1, 'Great event', 'lorum ipsum', ...
2, 'Another event', 'lorum ipsum', ...
localizations
1, 'events', 1, 'title', 'es', 'Gran evento'
问题:是否可以构建一个 mysql 查询来检索所有事件,以及它们的本地化英文标题,如果找不到则使用默认标题?
我怀疑它必须是这样的左连接
SELECT e.id, e.title, e.content
FROM `events` e
LEFT JOIN localizations loc ON loc.row_id = e.id
但只有在 loc.field = 'title' 和 loc.language='en'
时才必须加入
这里的技巧是 LEFT JOIN
,正如您已经发现的那样,结合 COALESCE()
。该函数 returns 其参数中的第一个非空值。
SELECT e.id, e.title,
COALESCE(ca.text, es.text, e.content) content
FROM events e
LEFT JOIN localizations ca ON ca.row_id = e.id AND ca.language = 'ca'
LEFT JOIN localizations es ON es.row_id = e.id AND es.language = 'es'
由此,在结果集的 content
列中,如果有加泰罗尼亚语文本,您将获得该文本。如果没有,并且有西班牙文本,您将得到它。否则你会得到主要 table.
中的任何东西
考虑以下 table 多语言事件数据库
events
id, title, content, ...
localizations
id, table_name, row_id, field, language, text
我的 CMS 所做的是在本地化翻译存储的情况下 table。 检索事件时,字段会被相应语言的本地化文本覆盖。
因此例如:
events
1, 'Great event', 'lorum ipsum', ...
2, 'Another event', 'lorum ipsum', ...
localizations
1, 'events', 1, 'title', 'es', 'Gran evento'
问题:是否可以构建一个 mysql 查询来检索所有事件,以及它们的本地化英文标题,如果找不到则使用默认标题?
我怀疑它必须是这样的左连接
SELECT e.id, e.title, e.content
FROM `events` e
LEFT JOIN localizations loc ON loc.row_id = e.id
但只有在 loc.field = 'title' 和 loc.language='en'
时才必须加入这里的技巧是 LEFT JOIN
,正如您已经发现的那样,结合 COALESCE()
。该函数 returns 其参数中的第一个非空值。
SELECT e.id, e.title,
COALESCE(ca.text, es.text, e.content) content
FROM events e
LEFT JOIN localizations ca ON ca.row_id = e.id AND ca.language = 'ca'
LEFT JOIN localizations es ON es.row_id = e.id AND es.language = 'es'
由此,在结果集的 content
列中,如果有加泰罗尼亚语文本,您将获得该文本。如果没有,并且有西班牙文本,您将得到它。否则你会得到主要 table.