mysql分组index_MySql 分组查询

此为网上整理,感谢dxy

创建数据表如下:

CREATE TABLE `test` (

`id` INT(10) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(255) NOT NULL,

`category_id` INT(10) NOT NULL,

`date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`)

)

ENGINE=MyISAM

ROW_FORMAT=DEFAULT;

INSERT INTO `test` (`id`, `name`, `category_id`, `date`)

VALUES

(1, 'aaa', 1, '2010-06-10 19:14:37'),

(2, 'bbb', 2, '2010-06-10 19:14:55'),

(3, 'ccc', 1, '2010-06-10 19:16:02'),

(4, 'ddd', 1, '2010-06-10 19:16:15'),

(5, 'eee', 2, '2010-06-10 19:16:35');

e096f705ea1fc16b719eb3668134ee6d.png

以category_id分组:

/*查询每个分组最新的一条记录*/

d1948645ec42b6844c70ada9f80b8b18.png

(1)select a.category_id,a.name,a.id ,max(a.date) rq from test a group by a.category_id;

(2)select * from test t where t.id in (select SUBSTRING_INDEX(group_concat(a.id order by a.date         desc),',',1) from test a group by a.category_id);

(3)select * from (select * from test t order by t.date desc) a group by a.category_id;

/*查询每个分组最新的n个记录 (没有n个取最多个)*/

35109fced1020080dfb81b0b27757168.png

(1)SELECT * FROM test a WHERE 2> (SELECT COUNT(*) FROM test b WHERE b.category_id       =a.category_id AND b.date>a.date) ORDER BY a.category_id,a.date;

(2)SELECT a.* FROM test a WHERE EXISTS (SELECT COUNT(*) FROM test b                             WHERE b.category_id=a.category_id AND b.date > a.date HAVING COUNT(*) < 2) ORDER BY a.category_id;

上面这2句的理解:

对TEST表 的每一行适用WHERE条件,如果对于当前遍历行,TEST表中不存在或只存在一行其时间比当前行大,则取出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值