如果找到,则用另一个表中的内容替换字段内容的SQL

时间:2015-10-07 12:35:12

标签: mysql sql database left-join translation

请考虑以下多语言事件数据库表

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'

1 个答案:

答案 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列中,您将获得加泰罗尼亚文本(如果有)。如果没有,西班牙文本就在那里,你就会明白。否则你会得到主表中的任何内容。