假设有一张表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,外层筛选可以通过增加筛选条件WHERE question_id = '16' 提高效率并减少create_time值相同的概率。

(3)可以通过增加字段is_first来标记第一条数据->

SELECT * FROM tb_question_reply WHERE is_first = 1

这样只需要增加一点额外操作:在为每个用户创建记录的时候判断是否是第一次插入,是的话is_first设为1即可

2、问:如果要查询id为16的题目有多少人做了和多少人做对了(以第一次提交的答案为准,id非自增)怎么写sql?

答:answer_status=2即表示该人做对了该题,可以在第1问的(2)回答的sql的基础上count(1) as做题人数,count(if(answer_status=2,1,null)) as做对人数 即可,但上面说过这样效率会低下而且我们只需要取出每条记录的answer_status就可以了,那其实可以这样做:将create_time与answer_status字段拼接起来后再进行MIN()操作,这样相当于取到了目标记录的两个字段,然后再用SUBSTR()函数将最后拼接上去的字符取下来即是answer_status了,写法如下->

SELECT count(1) persons_done, count(if(SUBSTR(p.tag,20)=2,1,null)) persons_right FROM 
(SELECT MIN(CONCAT(create_time,answer_status)) tag FROM tb_question_reply WHERE question_id = '16' GROUP BY user_id) p

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

  1. mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)

    mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)_toString的博客-CSDN博客 select * from  mt_customer_bind_info_ax ...

  2. sql group by 后取最后一条数据

    sql group by 后取最后一条数据 ##方法一 SELECT* FROMtable1 AS a,( SELECT * FROM table1 GROUP BY id ORDER BY id D ...

  3. mysql根据id删除数据库,MYSQL删除表中的指定ID数据

    MYSQL删除表中的指定ID数据 删除A表中的ID 中的开头以B* 的数据库. 复制代码 代码如下: delete FROM A WHERE id like 'B%' 单独删除 A 表中的ID B 复 ...

  4. mysql按行取数据_菜鸟求助:怎么在mysql隔12行取一条数据呀??

    你的位置: 问答吧 -> PHP基础 -> 问题详情 菜鸟求助:怎么在mysql隔12行取一条数据呀?? 我的问题是这样的: 我的数据库是每5分钟一行数据 我要隔一小时取一条数据 也就是每 ...

  5. 爬取图片到mysql数据库_爬取微博图片数据存到Mysql中遇到的各种坑\mysql存储图片\爬取微博图片...

    前言 由于硬件等各种原因需要把大概170多万2t左右的微博图片数据存到Mysql中.之前存微博数据一直用的非关系型数据库mongodb,由于对Mysql的各种不熟悉,踩了无数坑,来来回回改了3天才完成 ...

  6. oracle 排序后取中间的数据

     用minus取 3000和5000的差值 ----排序后取序列为3000-5000的数据 select * from table_name t where rownum<=5000 order ...

  7. mysql group top_Mysql group by 后取 top N 问题

    测试数据 DROP TABLE IF EXISTS `t`; CREATE TABLE `t` ( `id` int(11) NOT NULL, `class` varchar(255) DEFAUL ...

  8. mysql日期减后取月_mysql加减时间-函数-时间加减

    select timediff('23:40:00', ' 18:30:00'); -- 两时间相减 SELECT substring( timediff('23:40:00', ' 18:30:00 ...

  9. Mysql Group by 分组取最小的实现方法

    表结构如下图: 字段说明:id自增列,name姓名,age年龄, grade班级ID 想到得的结果如下图: 需求描述:取出每个班里年龄最小的用户 SQL如下: SELECT * FROM (SELEC ...

最新文章

  1. python中深浅复制教程
  2. EF4.1中诡异的GUID为空问题
  3. One order popup window 显示逻辑
  4. python ftplib模块_python:ftplib模块
  5. 没有动任何配置文件,今天就出现了修改的JSP内容在页面不体现。依然是老的页面内容...
  6. .netcore mvc docker环境jenkins一键部署(DevOps)
  7. 阶段3 2.Spring_03.Spring的 IOC 和 DI_13 课程知识梳理
  8. Java反编译工具汇总
  9. 刘奇:当今一切都要更实时、更弹性、更简单,TiDB 就是这样的基础设施 | TiDB DevCon 2020
  10. ofdm导频信道估计matlab,OFDM导频信道估计
  11. UVALive 3713 Astronauts(2SAT)
  12. 干货!STABLE - 一种无监督高鲁棒性图结构学习框架
  13. windows cmd 添加路由命令
  14. Redis——事务 锁机制
  15. display:none和visibility:hidden的区别
  16. Vitalik Buterin 《以太坊紫皮书》
  17. Xss挑战之旅writeup
  18. Openlayers 中code错误编码对应的问题
  19. Google Earth Engine ——MOD13A1 /A2V6产品在每个像素的基础上提供植被指数(VI)值(NDVI和EVI)
  20. C6820摄像头的托管驱动 - Codeplex

热门文章

  1. 移动电源/便携式汽车应急启动电源UKCA/CE认证
  2. Mac安装sshpass
  3. 模拟测静电场实验报告
  4. 11位CEO自述:全世界都怀疑我的时候,我选择了相信自己
  5. 人工神经网络 :模糊神经网络
  6. mysql 创建学生表、课程表、学生选课表
  7. 硬币问题(瓜子网二手车试题)
  8. BHQ-3 amine,1661064-89-6可在430nm至730nm范围内猝灭所有普通荧光团
  9. linux组权限管理,Linux组管理和权限管理
  10. ARCGIS怎么在地图上绘制长宽500m*500m的fishnet