关于mysql group by后取指定的数据留下来
假设有一张表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后取指定的数据留下来相关推荐
- mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)
mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)_toString的博客-CSDN博客 select * from mt_customer_bind_info_ax ...
- sql group by 后取最后一条数据
sql group by 后取最后一条数据 ##方法一 SELECT* FROMtable1 AS a,( SELECT * FROM table1 GROUP BY id ORDER BY id D ...
- mysql根据id删除数据库,MYSQL删除表中的指定ID数据
MYSQL删除表中的指定ID数据 删除A表中的ID 中的开头以B* 的数据库. 复制代码 代码如下: delete FROM A WHERE id like 'B%' 单独删除 A 表中的ID B 复 ...
- mysql按行取数据_菜鸟求助:怎么在mysql隔12行取一条数据呀??
你的位置: 问答吧 -> PHP基础 -> 问题详情 菜鸟求助:怎么在mysql隔12行取一条数据呀?? 我的问题是这样的: 我的数据库是每5分钟一行数据 我要隔一小时取一条数据 也就是每 ...
- 爬取图片到mysql数据库_爬取微博图片数据存到Mysql中遇到的各种坑\mysql存储图片\爬取微博图片...
前言 由于硬件等各种原因需要把大概170多万2t左右的微博图片数据存到Mysql中.之前存微博数据一直用的非关系型数据库mongodb,由于对Mysql的各种不熟悉,踩了无数坑,来来回回改了3天才完成 ...
- oracle 排序后取中间的数据
用minus取 3000和5000的差值 ----排序后取序列为3000-5000的数据 select * from table_name t where rownum<=5000 order ...
- 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 ...
- mysql日期减后取月_mysql加减时间-函数-时间加减
select timediff('23:40:00', ' 18:30:00'); -- 两时间相减 SELECT substring( timediff('23:40:00', ' 18:30:00 ...
- Mysql Group by 分组取最小的实现方法
表结构如下图: 字段说明:id自增列,name姓名,age年龄, grade班级ID 想到得的结果如下图: 需求描述:取出每个班里年龄最小的用户 SQL如下: SELECT * FROM (SELEC ...
最新文章
- python中深浅复制教程
- EF4.1中诡异的GUID为空问题
- One order popup window 显示逻辑
- python ftplib模块_python:ftplib模块
- 没有动任何配置文件,今天就出现了修改的JSP内容在页面不体现。依然是老的页面内容...
- .netcore mvc docker环境jenkins一键部署(DevOps)
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_13 课程知识梳理
- Java反编译工具汇总
- 刘奇:当今一切都要更实时、更弹性、更简单,TiDB 就是这样的基础设施 | TiDB DevCon 2020
- ofdm导频信道估计matlab,OFDM导频信道估计
- UVALive 3713 Astronauts(2SAT)
- 干货!STABLE - 一种无监督高鲁棒性图结构学习框架
- windows cmd 添加路由命令
- Redis——事务 锁机制
- display:none和visibility:hidden的区别
- Vitalik Buterin 《以太坊紫皮书》
- Xss挑战之旅writeup
- Openlayers 中code错误编码对应的问题
- Google Earth Engine ——MOD13A1 /A2V6产品在每个像素的基础上提供植被指数(VI)值(NDVI和EVI)
- C6820摄像头的托管驱动 - Codeplex