Mysql复杂操作

条件求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);

原理:子查询找到最大的时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值