我有以下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 |
+----+------------+-------------+
谢谢!
答案 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语句来删除临时表。