mysql通过返回具有首选项顺序的行来选择组

时间:2015-01-20 12:56:14

标签: mysql database select group-by having

我有以下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字段的首选顺序。例如:

lang首选顺序1,2,3:

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

lang首选顺序3,2,1:

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

根据你想要做的描述,你应该简单地用你想要的lang选择所有行

SELECT * FROM your_table WHERE lang = 1

答案 1 :(得分:0)

在一个查询中执行该操作要么不可能,要么不具备我的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语句来删除临时表。