【问题标题】:Sqlite GROUP BY prioritySqlite GROUP BY 优先级
【发布时间】:2013-09-22 12:45:23
【问题描述】:
+----+------------+------+
| id |   title    | lang |
+----+------------+------+
|  1 | title 1 EN | en   |
|  1 | title 1 FR | fr   |
|  1 | title 1 ZH | zh   |
|  2 | title 2 EN | en   |
|  3 | title 3 ZH | zh   |
+----+------------+------+

这是我的桌子,我想按 id 分组,但有时我需要语言“en”优先,有时我需要语言“zh”作为优先级

SELECT * FROM table GROUP BY id

给我一​​个所有 uniqe id 的列表,但将 zh 放在 id 1 的位置,我可以为语言添加优先级吗?

我想要的“en”输出:

+----+------------+------+
| id |   title    | lang |
+----+------------+------+
|  1 | title 1 EN | en   |
|  2 | title 2 EN | en   |
|  3 | title 3 ZH | zh   |
+----+------------+------+

我想要的“fr”输出:

+----+------------+------+
| id |   title    | lang |
+----+------------+------+
|  1 | title 1 FR | fr   |
|  2 | title 2 EN | en   |
|  3 | title 3 ZH | zh   |
+----+------------+------+

我想要的..不断地:)

【问题讨论】:

  • ORDER BY lang DESC/ASC - 在 GROUP BY 子句之后
  • 你想要的输出是什么?
  • 但是我有可能有一个额外的 id 和 lang "fr" 那么我怎么能支持 fr 呢?
  • SELECT * FROM table WHERE lang = x; 那么我想这就是你所需要的......因为 GROUP BY 无论如何都会合并记录,对吧?
  • 如果我放一个 where lang="fr" 我不会得到 id 2 和 3 的记录

标签: sql sqlite group-by


【解决方案1】:

从 SQLite 3.7.11 开始,您可以使用MAXMIN 选择返回组中的哪条记录。 像 lang = 'en' 这样的布尔表达式返回 0 或 1:

SELECT *,
       MAX(lang = 'en')
FROM MyTable
GROUP BY id

如果您想优先考虑一种以上的语言,可以使用CASE expression

SELECT *,
       MAX(CASE lang
           WHEN 'en' THEN 2
           WHEN 'fr' THEN 1
                     ELSE 0
           END)
FROM MyTable
GROUP BY id

【讨论】:

  • 这同时是一个令人着迷和可怕的功能(在我熟悉的其他 RDBM 中,包括不是聚合的列或 GROUP BY 子句的成员都会导致错误或未定义的行为) .我看到 3.7.11 的发行说明中提到了这个功能,但我在常规文档中找不到它。 sqlite 文档是否保持最新,或者我是否应该阅读所有发行说明以了解其特殊功能?
  • 发行说明文档的一部分。我猜想添加这个功能只是因为付费客户想要它。
猜你喜欢
  • 2013-11-26
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多