【问题标题】:MySQL select given number of rows and always select all rows within the same dayMySQL选择给定的行数并始终选择同一天内的所有行
【发布时间】:2011-11-04 09:09:19
【问题描述】:

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

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

我的问题是,如果一天中的一行将包含在结果中,我总是想要一天内的所有行。 使用例如结果是没有问题的。 102 行而不是 100 行

我可以用一条 SQL 语句来实现吗?

感谢您的帮助!

【问题讨论】:

  • 您是说如果结果中表示超过一天,您希望 LIMIT 保持在 100,但如果所有结果都发生在同一天,您希望没有 LIMIT?
  • 很难理解。您能否提供示例输入和预期输出?
  • 必须为此删除 LIMIT,这是肯定的。我只想得到大约 100 个结果,但总是想得到一整天。所以,如果最后一行是在给定的一天,而下一行也是在那一天,我也想在我的结果中包含这一行。即使这意味着我会得到 101 行......
  • 我想我明白了。我已经修改了答案。

标签: mysql sql date datetime


【解决方案1】:

这似乎适用于我的系统:

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.

可能有更快的替代方案。

【讨论】:

    【解决方案2】:

    如果我正确理解了您的问题,您对检索 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
    

    【讨论】:

    • 我刚刚测试了这个,它似乎选择了 100 天的所有行
    【解决方案3】:

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

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

    【讨论】:

    • 这只会返回时间范围内的所有项目。我只想得到大约 100 个结果。我很清楚我必须为此删除 LIMIT 。我只是没有看到一种简单、高效的方法来获得大约 100 行并且不中断任何一天。
    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2022-07-19
    • 2010-11-18
    相关资源
    最近更新 更多