【问题标题】:SQL to replace field content with content from another table if foundSQL 将字段内容替换为另一个表中的内容(如果找到)
【发布时间】:2015-10-07 20:43:21
【问题描述】:

考虑下面的多语言事件数据库表

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' 时才需要加入

【问题讨论】:

    标签: mysql sql database left-join translation


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

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 1970-01-01
      • 2012-05-24
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 2016-01-08
      相关资源
      最近更新 更多