Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26267534
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: 数据库开发技术

2008-12-04 13:58:08

三、核心原理
 
只有深入理解这些语句执行的过程才能做到心中有数,明明白白写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);
子查询不知道速度如何哦?

 







阅读(805) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~