mysql 分组查询
2012-03-26 17:06
316 查看
一、表结构
二、目的
按client_id分组,查询每个client_id中离目前时间最近的记录。
查询结果示意
三、解决方案
方案1:
方案2:
方案3:
如果有更高效的SQL,欢迎回复!
-- -- 表的结构 `client_status` -- CREATE TABLE IF NOT EXISTS `client_status` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `client_id` mediumint(8) unsigned NOT NULL, `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), ) -- -- 转存表中的数据 `client_status` -- INSERT INTO `client_status` (`id`, `client_id`, `addtime`) VALUES (3, 1, '2012-03-26 10:32:30'), (4, 1, '2012-03-26 10:30:31'), (5, 1, '2012-03-26 10:30:32'), (6, 2, '2012-03-26 10:30:33'), (7, 2, '2012-03-26 10:30:34'), (8, 4, '2012-03-26 10:30:35'), (9, 4, '2012-03-26 10:30:36'), (10, 3, '2012-03-26 10:30:37'), (11, 3, '2012-03-26 10:30:38');
二、目的
按client_id分组,查询每个client_id中离目前时间最近的记录。
查询结果示意
id | client_id | addtime |
---|---|---|
3 | 1 | 2012-03-26 10:32:30 |
7 | 2 | 2012-03-26 10:30:34 |
11 | 3 | 2012-03-26 10:30:38 |
9 | 4 | 2012-03-26 10:30:36 |
方案1:
SELECT * FROM (SELECT * FROM client_status ORDER BY addtime DESC )a GROUP BY client_id explain分析
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 9 | Using temporary; Using filesort |
2 | DERIVED | client_status | ALL | NULL | NULL | NULL | NULL | 9 | Using filesort |
SELECT * FROM client_status a WHERE NOT EXISTS (SELECT 1 FROM client_status WHERE a.client_id = client_id AND a.addtime < addtime)
explain分析
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | PRIMARY | a | ALL | NULL | NULL | NULL | NULL | 9 | Using where |
2 | DEPENDENT SUBQUERY | client_status | ref | client_id | client_id | 3 | pdmon.a.client_id | 1 | Using where |
SELECT * FROM `client_status` WHERE addtime IN (SELECT max( addtime ) FROM client_status GROUP BY client_id )
explain分析
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | PRIMARY | client_status | ALL | NULL | NULL | NULL | NULL | 9 | Using where |
2 | DEPENDENT SUBQUERY | client_status | index | NULL | client_id | 3 | NULL | 1 |
相关文章推荐
- MySQL之数据查询语法(DQL)--(7)分组查询
- mysql排序查询,多条件排序查询,聚合函数的使用,分组统计查询,
- mysql分组查询最新数据
- Mysql按照字段值做分组行转列查询
- MySQL 查询分页数据中分组后取每组的前N条记录
- mysql分组查询 排序
- sql 分组查询-mysql
- mysql-利润set变量模拟分组查询每组中的第N条数据
- MySQL分组查询Group By实现原理详解
- mysql sql_mode 修改 排序分组查询
- 【数据库-MySql】按时间间隔分组查询 group by count(*) date_format
- mysql 分组查询某一列最大的前10条记录
- 记录一个mysql按日期分组统计的查询
- MySQL中的分组查询与连接查询语句
- mysql 数据库笔记-基本查询(分组、聚合函数)
- MySQL--操作简记(汇总数据(聚集函数),分组数据,子查询)
- 记录一个mysql按日期分组统计的查询
- MySql排序,分组,树查询
- mysql不支持full join的另一种解决办法 和根据多个表中的相同分组来连接查询
- MySql 分组查询