按照一个字段分组,按照另一个字段排序的结果;

之前面试遇到一个问题——关于SQL查询的,如何得到一个博客表中每个用户的最新作品

当时我考虑了几分钟,发现这个问题看上去很简单,但我确实没有马上想到什么答案。
下面的是简单数据库表结构
CREATE TABLE `iblog` (
 `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
 `content` varchar(150) NOT NULL DEFAULT '' COMMENT '内容',
 `user_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '作者ID',
 `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
 PRIMARY KEY (`id`),
 KEY `user_id` (`user_id`)
)
 
问题关键是“最新作品”和“每个用户”。我首先想到的是先得到“所有用户ID”,并使用where+in作为查询条件,然后再对按照时间排序。得到的SQL语句是
select * from iblog where user_id in (SELECT user_id FROM `iblog` group by user_id) order by id desc

但是这样好像很麻烦。我觉得应该有更简单的,于是想到分组group by 完全可以放到父查询中,那么就不需要子查询了。
select * from iblog group by user_id order by id desc

——————————————————

以上均是我的推测并没有测试过。后来经过我测试之后,发现之前的答案是错的。第一个查询语句会得到所有的数据,这个太失败了,当时脑子估计转晕了。第二查询结果,并不是作者最新的作品而是最早的作品。

再后来我看了看官方手册,发现group by 之后可以加 asc/desc 。嗯,就是这个关键词。

查询语句:

select * from iblog 
where
id in (
select max(b.id) from iblog as b
group by b.user_id
)
order by id desc;


这样得到的结果是满足预期,但结果是按照用户ID排列的,所以还有加一个排序:

 

当初学习SQL查询,对分组没有仔细了解,才弄成这样的结果。以后应该多了解下SQL查询

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值