mysql中查询每天的前5条数据
有一个表a,记录的是一个月中每天的若干条数据,比如现在是3月份,表a中就有3月1日的n条数据,3月2日的那条数据……3月25日的n条数据;现在我想查询出每天的前5条数据,...
有一个表a,记录的是一个月中每天的若干条数据,比如现在是3月份,表a中就有3月1日的n条数据,3月2日的那条数据……3月25日的n条数据;现在我想查询出每天的前5条数据,要求结果是1-5行显示3月1日的5条数据,6-10行是3月2日的5条数据……
请问这个怎么处理,很多类似问题都说用limit 5;但结果limit只是显示所有查询结果的前5条,跟我要求的有区别,请问怎么写sql语句? 展开
请问这个怎么处理,很多类似问题都说用limit 5;但结果limit只是显示所有查询结果的前5条,跟我要求的有区别,请问怎么写sql语句? 展开
3个回答
推荐于2016-03-15
展开全部
SELECT
*
FROM
表 main
WHERE
(
SELECT
COUNT(1)
FROM
表 sub
WHERE
DATE ( main.日期时间列 ) = DATE ( sub.日期时间列 )
AND main.日期时间列 > sub.日期时间列
) < 5
ORDER BY
main.日期时间列
*
FROM
表 main
WHERE
(
SELECT
COUNT(1)
FROM
表 sub
WHERE
DATE ( main.日期时间列 ) = DATE ( sub.日期时间列 )
AND main.日期时间列 > sub.日期时间列
) < 5
ORDER BY
main.日期时间列
追问
先谢谢,但刚才试了下,执行查询很长时间都没出结果,有什么效率更高的方法吗?
追答
如果你数据量很大的话, 那就要写存储过程了。
基本上是通过使用 游标 + 动态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;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上给的那个方法确实可以一句话查出LZ要的分组前n条结果。但是我劝LZ不要用,因为效率低到可怕!5000条数据就需查上6秒以上,而且还是在有正确索引的前提下。(本人以前吃过这苦头)
追问
刚才试了下,的确很长时间还没有结果,这个表一般会有几十万条数据,还有什么好办法吗?
追答
我是没找到,你结合脚本语言,分段写吧。或者用存储过程也可以,但效率也差不多。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用 union all
追问
你的意思是不是写30条查询每天前5条数据的sql然后用union连起来?
追答
也可以用程序写。单纯sql语句肯定慢死。
可以写一个日期数组 循环每天的数据 综合起来就是一个月的每天5条。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询