mysql为什么 不能先排序后分组呢?

hphper 发布于 2015/06/01 17:47
阅读 8K+
收藏 0

我有一下一张表

我要查出某一个具体openid的最新一条 的信息,

我想先这样

select addtime ,content,openid from msg  WHERE `openid`='olV6gjjEV42giwlI4fOox58P1Skk'  ORDER BY addtime DESC    ;

把符合条件的最后一条冒上来,然后 我想加个group by openid就会 获取到啊,

select addtime ,content,openid from msg  WHERE `openid`='olV6gjjEV42giwlI4fOox58P1Skk'  ORDER BY addtime DESC  group by openid  ;

但是 语法错误,为啥只能先分组再排序呢,而不能先排序再分组,而我难道要用子查询吗



加载中
0
萌萌哒丶
萌萌哒丶
如果二者在同一个select 子句中,肯定是先使用 group by 分组,为的是使用聚合函数,order by 放在后面,起作用只是为了将查询结果排序。举个例子:
按班级求最高成绩:
select class_num, max(score) from student group by classnum order by class_num;
此语句,先按班级分组,求出最高成绩,然后将结果按照班级号排序。
 
如果不是同一个select 子句,那就不一定了,例如:
select a.字段, b.字段 from (a子查询,其中包含order by) a, (b子查询,其中包含group by) where 关联条件;
这种情况下,order by 有可能在 group by 之前。但是二者没有什么相互的影响。   -------借来的答案
hphper
hphper
按照在一个sql里的,那我如果想知道最高成绩者的姓名等其它信息,这些信息 和这个最高成绩可能就不对应了
0
霍啸林
霍啸林
感觉跟分组没关系,TOP 或者 Limit一下就行了
霍啸林
霍啸林
回复 @hphper : 我是看到你题目里说的“某一个具体openid”,才这么回答的,需求变得真快啊
hphper
hphper
我openid不是只有1个,可能很多个,我想一次查出多个不同openid的最新记录,limit?怎么Limit啊
0
骨二
骨二
你使用了分组 那样你查询的字段必须参与分组 要不肯定报错的
hphper
hphper
没参与吗?
0
yeliuping
yeliuping
group by openid :每个openid值对应的查询列必须只有一列(一一对应吧),如果有重复的话不知道以那条数据为准,所以会保存
yeliuping
yeliuping
所以会报错
0
mark35
mark35

msyql这种废物才会让mysqler写出

select * from tbl  WHERE xxx  group by openid  ;
这种不符合逻辑的SQL

逝水fox
逝水fox
有些时候这样的写法确实有用。另外,MySQL也提供了机制来禁用这个写法,只是大多数人不去研究而已
0
hphper
hphper

引用来自“萌萌哒丶”的评论

如果二者在同一个select 子句中,肯定是先使用 group by 分组,为的是使用聚合函数,order by 放在后面,起作用只是为了将查询结果排序。举个例子:
按班级求最高成绩:
select class_num, max(score) from student group by classnum order by class_num;
此语句,先按班级分组,求出最高成绩,然后将结果按照班级号排序。
 
如果不是同一个select 子句,那就不一定了,例如:
select a.字段, b.字段 from (a子查询,其中包含order by) a, (b子查询,其中包含group by) where 关联条件;
这种情况下,order by 有可能在 group by 之前。但是二者没有什么相互的影响。   -------借来的答案

比如一个表

CREATE TABLE `tt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `class_id` tinyint(4) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
INSERT INTO `tt` VALUES (1, 'hk', 1, 1);
INSERT INTO `tt` VALUES (2, 'xm', 1, 2);
INSERT INTO `tt` VALUES (3, 'hk1', 1, 3);
INSERT INTO `tt` VALUES (4, 'xx', 2, 3);
INSERT INTO `tt` VALUES (5, 'ww', 2, 4);

我想查出 每个班级里最大学生的信息

我这样查

SELECT max(age) ,name,class_id  from tt GROUP BY class_id ORDER BY age desc ;

发现这个最大的age和这个学生的姓名在表记录里根本不是在一行上


p
phper08
没有分组的要使用聚合函数
0
hphper
hphper

引用来自“yeliuping”的评论

group by openid :每个openid值对应的查询列必须只有一列(一一对应吧),如果有重复的话不知道以那条数据为准,所以会保存

谢谢您,我不太明白您的意思

你看下我以一个简单的表来再说下我的问题

这样一张表

CREATE TABLE `tt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `class_id` tinyint(4) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
INSERT INTO `tt` VALUES (1, 'hk', 1, 1);
INSERT INTO `tt` VALUES (2, 'xm', 1, 2);
INSERT INTO `tt` VALUES (3, 'hk1', 1, 3);
INSERT INTO `tt` VALUES (4, 'xx', 2, 3);
INSERT INTO `tt` VALUES (5, 'ww', 2, 4);

就是


我想获取每个班级(class_id)最大年年龄的学生的信息(现在最多假设最大的就一条)

第一步我想先这样查询


如果以上的查询结果最为一张表,然后再查 就是在上面结果加上group by class_id即可,

我想这样的

SELECT class_id ,age ,name from tt  ORDER BY age desc, class_id desc GROUP BY class_id

结果语法就报错

非得子查询

这样才行,为什么不能放在一个sql里,放在一起为啥报错呢,求赐教

hphper
hphper
但我又想获取与之对应的age,name相关信息怎么办?
yeliuping
yeliuping
比如class_id=1的name有hk,xm,hk1三条数据,group后查询列有name列,数据库不知道class_id=1和name列中的三条中的哪条组合,就会报错。如果你把查询语句select的age,name字段去掉就不会报错,说明我说的没错
0
hylent
hylent

两次查询,适用于id最大的是最新的记录。

select * from tb where id in (select max(id) from tb where 1 = 1 group by openid);

hphper
hphper
一次咋做?
0
六点小巷
六点小巷

数据库的设计是先分组再排序,这是毋庸置疑的,你先分组看到结果之后,在考虑排序的问题,(升序 降序 还是按条件排序)

hphper
hphper
先排序后分组有啥逻辑错误呢?
霍啸林
霍啸林
同意
0
sxgkwei
sxgkwei
select b.* from (select max(id) as id from a group by openid) a left join b on a.id=b.id
返回顶部
顶部