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.

中的任何东西