条件求count
select count(d=0 or null) from
select count(if(d=0,1,null)) from
存在则更新,不存在则插入
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b)
获取排名
select u.rownum as `rank` from ( select *,(@rownum:=@rownum+1) AS rownum from `t_test`,(SELECT @rownum:=0) r order by acc desc) u where u.id=? AND section_id=? AND type=?;
MySql 查询最近几天数据
SELECT * FROM t_work_like where DATE_SUB(CURDATE(), INTERVAL 3 DAY) <= date(vote_time);
获取本周数据
# YEARWEEK(now(),1) 后面的1表示从周几开始 0表示这周从周日开始算 以此类推
SELECT modifyDate FROM tb_product WHERE YEARWEEK(date_format(modifyDate,'%Y-%m-%d'),1) = YEARWEEK(now(),1);
获取本月数据
select name,submittime from enterprise where date_format(submittime,'%Y-%m')=date_format(now(),'%Y-%m')
获取本周日日期
select * from `test` where `created_at` between subdate(curdate(),date_format(curdate(),'%w')+0)
分组后获取每组前几个数据
select * from `t_answer_stat` a where (
select count(`keypoint_id`)
from `t_answer_stat` b
where b.keypoint_id=a.keypoint_id and b.`created_at`>=a.`created_at`
)<=3;
原理:
先查出一条记录,然后带着这条记录判断比他大(小)的数据有多少条,小于等于三条,那么就是前三条记录,但是在有记录相等的时候会存在问题,并不能保证一定出来的是三条,另外就是执行时间过长,相当于遍历了整个表的两层for循环。
另外一种实现:
select * from
(select * from `t_answer_stat` order by `created_at` desc LIMIT 10000) a
group by a.keypoint_id ;
原理:
利用子查询和group by的特点,先将数据逆序排列,然后进行group by,group by 默认使用第一个数据,使用limit的原因在于新版本mysql对子查询的优化,外部查询需要分组,认为子查询排序无意义,固不进行排序,但是使用limit后就可以解除该限制
另外一种实现:
select * from `t_answer_stat` where created_at in (select max(created_at) from `t_answer_stat` group by keypoint_id);
原理:子查询找到最大的时间