【问题标题】:Operations within group when GROUP BYGROUP BY 时组内的操作
【发布时间】:2011-11-27 23:43:05
【问题描述】:

items的key由(lang, id)组成。有些项目有不同语言的翻译名称。我想创建这样一个查询,该查询将以给定语言从数据库中返回所有项目,并且如果项目没有翻译以返回未翻译的值。

假设我想获取用保加利亚语书写的所有项目。这就是我卡住的地方:

SELECT lang, id, name
FROM items
WHERE lang = "bg" OR lang = "en"
GROUP BY id

当有一个项目(1“en”)和一个项目(1“bg”)。 id是一样的。那么 MySQL 或 SQLite 如何确定返回哪个结果呢?有什么办法可以告诉它我宁愿返回 (1, "bg") 如果它存在但如果它不存在则 ( 1, "en") 会满足我吗?

附言 为了进一步说明我想要什么,让我们假设数据库包含以下带有架构(id、lang、name)的条目:

(1, "en", "abc")

(2, "en", "cde")

(3, "en", "def")

(1, "bg", "абв")

(3, "bg", "жзи")

执行保加利亚语所需的查询后,我应该得到:

(1, "bg", "абв")

(2, "en", "cde")

(3, "bg", "жзи")

【问题讨论】:

    标签: mysql sql sqlite


    【解决方案1】:

    如果“未翻译”的意思是“英语”,或者换句话说,基本语言是英语,你可以LEFT将表连接到自身并使用COALESCE()函数去除NULL的值

    SELECT COALESCE(bg.lang, en.lang) AS lang
         , en.id                      AS id
         , COALESCE(bg.name, en.name) AS name
    FROM items en
      LEFT JOIN items bg
        ON  bg.id = en.id
        AND bg.lang = 'bg'
    WHERE en.lang = 'en'
    

    【讨论】:

      【解决方案2】:

      标准 SQL 不允许您在“分组依据”查询中选择不 (1) 出现在分组依据列表中或 (2) 不包含在聚合函数中的列。任何工业级 SQL 引擎(DB2、Oracle、SQL Server)都会认为您的查询不正确。

      如果您需要选择特定项目或数据库中不存在的默认项目,则使用coalesce 函数。有了这个功能,您应该能够在没有“分组依据”的情况下制定您的查询。

      【讨论】:

      【解决方案3】:

      您可以在多个列上执行GROUP BY

      SELECT lang, id, name
      FROM items
      WHERE lang = "bg" OR lang = "en"
      GROUP BY id, lang
      

      【讨论】:

      • 我知道,但这会返回 (1, "bg") 和 (1, “zh”)。我实际上不想得到具有多个 id 的结果。
      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多