【问题标题】:mysql select with group by returning rows with a preference ordermysql select with group 通过返回具有偏好顺序的行
【发布时间】:2015-03-18 17:12:18
【问题描述】:

我的mysql查询结果如下:

+----+------------+-------------+
| id |   title    |     lang    | 
+----+------------+--------------
| 1  | ola1       |  1          | 
| 1  | hello1     |  2          |
| 1  | bonjour1   |  3          |
| 2  | ola2       |  1          | 
| 2  | bonjour2   |  3          |
| 3  | hello3     |  2          |
| 4  | bonjour4   |  3          |
+----+------------+-------------+

我想要的是按 id 进行 group_by 查询,它为每个 id 提供标题以及 lang 字段的优先顺序。示例:

语言偏好顺序 1、2、3 的结果:

+----+------------+-------------+
| id |   title    |     lang    | 
+----+------------+--------------
| 1  | ola1       |  1          | 
| 2  | ola2       |  1          | 
| 3  | hello3     |  2          |
| 4  | bonjour4   |  3          |
+----+------------+-------------+

语言偏好顺序 3、2、1 的结果:

+----+------------+-------------+
| id |   title    |     lang    | 
+----+------------+--------------
| 1  | bonjour1   |  3          | 
| 2  | bonjour2   |  3          | 
| 3  | hello3     |  2          |
| 4  | bonjour4   |  3          |
+----+------------+-------------+

谢谢!

【问题讨论】:

  • 请澄清您的问题。为什么在您的第二个结果集示例中 lang 值乱序(3,3,2,3):什么逻辑生成了该顺序? ORDER BY lang ASC...DESC 会为你做,还是我错过了什么?为什么GROUP BY
  • 嗨奥利!感谢您的回答。我说 group by 是因为我希望每个 id 有一行,这是通过 group by 关键字完成的。但是我希望能够根据 lang 字段选择将选择哪一行。因此,假设我偏好语言 1,然后是 2,然后是 3。我想为每个 id 返回具有 lang=1 的行,如果存在具有该语言的行,如果没有选择 lang=2,依此类推。 ..

标签: mysql database select group-by having


【解决方案1】:

要么不可能,要么我的 SQL 技能无法在一个查询中执行它。对于这些问题,我总是使用一个临时模板和两个 SQL 命令:

(假设你的表叫Table1,临时表应该叫tempTable)

SELECT Table1.id, Min(Table1.lang) AS Min_Of_lang INTO tempTable FROM Table1 GROUP BY Table1.id ORDER BY Table1.id;
SELECT Table1.* FROM tempTable INNER JOIN Table1 ON (tempTable.MinOflang = Table1.lang) AND (tempTable.id = Table1.id);

第一个命令创建一个新表(如果存在则覆盖当前表)。第二个命令使用第一个表生成所需的结果集。

要从您的第一个所需结果表更改为第二个,请在第一个查询中使用 Max 而不是 min。

其他人可能有比我更优雅的解决方案。此外,可以添加额外的 SQL 语句来删除临时表。

【讨论】:

  • 是的...不幸的是,我认为在一个查询中也是不可能的...我想我会在应用层中进行行选择。非常感谢!
【解决方案2】:

这是 MySQL 中未定义的功能。非聚合列中的显示值未确定。 read more here (MySQL Documentation).

(标准 SQL 不允许在使用 GROUP BY 时包含非聚合列,我想这是原因之一。

根据您对您想要做的事情的描述,您应该使用您正在寻找的语言简单地选择所有行

SELECT * FROM your_table WHERE lang = 1

【讨论】:

  • 感谢您的回答。这是行不通的,因为不允许我为每个 id 设置 lang = 1。在这种情况下,我希望选择根据定义的语言偏好顺序返回其他语言。
猜你喜欢
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2012-11-22
  • 1970-01-01
相关资源
最近更新 更多