假设有一张表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,外层筛