关于mysql group by后取指定的数据留下来

本文介绍了如何使用MySQL查询特定题目(例如ID为16)的用户首次答题记录,以及统计答题人数和正确人数。通过不同方法处理非自增ID的情况,包括利用GROUP BY的默认排序、子查询结合IN操作以及添加额外字段is_first。同时,讨论了SQL优化和效率问题。
摘要由CSDN通过智能技术生成

假设有一张表tb_question_reply(答题记录表)拥有以下字段

id、user_id、paper_id、question_id、user_answer、answer_status(答题情况,0全错,1半对,2全对)、create_time

1、问:如果要把题目id为16的所有人的第一次答题记录都查出来怎么写sql?

     答:(1)如果id是自增的,很简单->  

SELECT * FROM `tb_question_reply` WHERE question_id = '16' GROUP BY user_id

因为group by后取的一条数据默认是按照主键id排序后的第一条,而id是自增的所以id越小代表创建的时间越早。

           (2)如果id不是自增的(如uuid)可以先子查询获取group by后最小的create_time,然后再用in筛选create_time->

SELECT * FROM tb_question_reply WHERE question_id = '16' and create_time IN (SELECT MIN(create_time) FROM `tb_question_reply` WHERE question_id = '16' GROUP BY user_id)

但如果create_time存在相同的值就会多查出数据,而且in会影响效率,就算为create_time建了索引它的的explain 的type也是range,外层筛

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值