MySQL选择给定的行数并始终在同一天内选择所有行

时间:2011-11-04 09:09:19

标签: mysql sql date datetime

我想做一个MySQL查询,它从给定偏移量的单个表中选择给定数量的行,如

SELECT * FROM table 
WHERE timestamp < '2011-11-04 09:01:05' 
ORDER BY timestamp DESC 
LIMIT 100

我的问题是,如果结果中包含一天中的一行,我总是希望一天内所有行。 用例如结果是没有问题的。 102行而不是100行

我能用单个SQL语句实现这个吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

这似乎适用于我的系统:

SELECT UserID, Created
FROM some_user
WHERE Created < '2011-11-04 09:10:11'
AND Created >= (
    SELECT DATE(Created) -- note: DATE() strips out the time portion from datetime
    FROM some_user
    WHERE Created < '2011-11-04 09:10:11'
    ORDER BY Created DESC
    LIMIT 99, 1 -- note: counting starts from 0 so LIMIT 99, 1 returns 100th row
)
ORDER BY Created DESC
-- 0 rows affected, 102 rows found. Duration for 1 query: 0.047 sec.

可能有更快的替代方案。

答案 1 :(得分:1)

如果我正确理解了您的问题,您有兴趣检索100行,+与已检索的行在同一天的任何行。您可以使用子查询执行此操作:

SELECT table.* 
FROM table, (
        SELECT DISTINCT day 
        FROM (
            SELECT TO_DAYS(timestamp) day 
            FROM table 
            WHERE timestamp < :? 
            LIMIT 100
            )
    ) days
WHERE TO_DAYS(table.timestamp) = days.day 
ORDER BY timestamp

答案 2 :(得分:0)

排除查询中的时间部分并删除LIMIT。

SELECT * FROM table 
WHERE timestamp < '2011-11-04 00:00:00' 
ORDER BY timestamp DESC