三、核心原理
只有深入理解这些语句执行的过程才能做到心中有数,明明白白写SQL。下面是带有WHERE和HAVING的SELECT语句执行过程:
1、执行WHERE筛选数据
2、执行GROUP BY分组形成中间分组表
3、执行WITH ROLLUP/CUBE生成统计分析数据记录并加入中间分组表
4、执行HAVING筛选中间分组表
5、执行ORDER BY排序
呵呵,知道了执行过程,神秘的GROUP/WHERE/HAVING/WITH...将不再神秘。
select * from t group by username order by logtime desc
) j$ u& D3 _0 I, b5 V
2 V0 ?$ K3 f1 ^% }1 uMySQL对上述语句的处理方式是: 先群组,群组后再排序
/ ^# c" n d8 ~! x; k1 q( D4 l% a! z6 }1 k, f- G% q' M" i/ h
但是我现在想排序后再群组该如何解决呢?
有一个表T
id name
1 a
2 a
3 b
4 c
5 c
如何才能查询我要的结果如下:
id name
2 a
3 b
5 c
如果用分组:select * from T group by name
方案一:
select * from (select * from t order by id desc) t2 group by username
[相当于是从另一个临时表中查询出来的哦哈哈!]
先得到一个结果集然后再从中去查询出来的哦!妙!然后再分组吧
方案二:
select * from t where id in (select max(id ) from t group by name)
这个更加强悍哈哈!
首先判断一下这样来分组中得到的最大的一个ID值 然后以这个ID作为条件去查询出来的哦!
方案三:更加强悍的一个SQL命令太牛了
select max(id),name from t group by name order by max(id);
看看吧!强悍吧![可惜不能提取其他的相关字段比较郁闷 哈哈!]
整理好自己所需要的一个SQL命令吧!
自己所需要的一个语句:
方案一:
select * from (select * from checklog order by id desc) t1,host t2 where t2.host=t1.host group by t1.host;
[表示是先得到一个表然后从这个表中提取出来相关的记录信息哦!]
方案二:
select a.Host,a.Code,a.TimeConsumes,a.CheckTime from checklog a,host b where a.host = b.host and a.id in (select max(a.id) from checklog a group by a.host);
子查询不知道速度如何哦?
阅读(845) | 评论(0) | 转发(0) |