发布网友 发布时间:2022-04-07 17:14
共3个回答
热心网友 时间:2022-04-07 18:43
SELECT追答如果你数据量很大的话, 那就要写存储过程了。
基本上是通过使用 游标 + 动态SQL 的处理机制。
先游标, 查询共有哪些天, 游标内部 拼 SQL
也就是 拼一个
SELECT *
FROM 表
WHERE DATE( 日期时间列 ) = 游标里面的日期
ORDER BY 日期时间列
LIMIT 5
UNION ALL ...... 游标中循环处理.
游标处理完毕后, 执行动态 SQL , 完成查询。
例子代码有点长, 不知道贴不贴得上来。
还有一种写法, 是通过 模拟 ROW_NUMBER + PARTITION 的方式来处理, 性能嘛,倒是比上面那个好一些, 但是很大数据量的, 就没有测试过了, 你可以尝试一下。
SELECT
日期时间列,
其他列
FROM
(
SELECT
CASE
WHEN @cn != DATE_FORMAT(日期时间列, 'YYYYMMDD') THEN @rownum:= 1
ELSE @rownum:= @rownum + 1
END AS No,
@cn := DATE_FORMAT(日期时间列, 'YYYYMMDD') AS ymd,
日期时间列,
其他列
FROM
(SELECT @rownum:=0) r,
(SELECT @cn:='') p,
表
ORDER BY
日期时间列
) subQuery
WHERE
no <=5;
热心网友 时间:2022-04-07 20:01
楼上给的那个方法确实可以一句话查出LZ要的分组前n条结果。但是我劝LZ不要用,因为效率低到可怕!5000条数据就需查上6秒以上,而且还是在有正确索引的前提下。(本人以前吃过这苦头)追问刚才试了下,的确很长时间还没有结果,这个表一般会有几十万条数据,还有什么好办法吗?追答我是没找到,你结合脚本语言,分段写吧。或者用存储过程也可以,但效率也差不多。
热心网友 时间:2022-04-07 21:36
用 union all追问你的意思是不是写30条查询每天前5条数据的sql然后用union连起来?追答也可以用程序写。单纯sql语句肯定慢死。
可以写一个日期数组 循环每天的数据 综合起来就是一个月的每天5条。