请考虑以下多语言事件数据库表
events
id, title, content, ...
localizations
id, table_name, row_id, field, language, text
我的CMS所做的是翻译存储区域表中的翻译。 检索事件时,字段会被适当语言的本地化文本覆盖。
因此,例如:
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'
答案 0 :(得分:1)
这里的诀窍是LEFT JOIN
,正如您已经发现的那样,与COALESCE()
相结合。该函数从其参数中返回第一个非空值。
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
列中,您将获得加泰罗尼亚文本(如果有)。如果没有,西班牙文本就在那里,你就会明白。否则你会得到主表中的任何内容。