【问题标题】:How can I get MySQL records from past 7 days, but only days that have a record, and return each day as a record?如何获取过去 7 天的 MySQL 记录,但只有有记录的日子,并每天作为记录返回?
【发布时间】:2013-06-15 23:58:38
【问题描述】:

假设我有一个简单的 mysql 表,其中包含 id、title、date 列。每天可以有几行,但不是每一天都有一行。例如,可能有 5 行以 6 月 15 日为日期,但零行以 6 月 14 日为日期。我怎样才能得到过去 7 天的所有结果,不包括 6 月 14 日,因为它没有行。所以我不只是从当前日期减去 7 天。我只想获取过去 7 天的所有行。

然后我想将每一天作为单个结果返回,就像按日期分组一样,但是按时间戳的年/月/日部分,这样我得到的只有 7 个结果,每个结果就像单个行的数组。

我希望这是有道理的。有什么想法吗?

编辑: 我意识到我可以这样做:

WHERE Date BETWEEN DATE_SUB( NOW(), INTERVAL DATEDIFF( NOW(), (SELECT Date FROM test GROUP BY Date LIMIT 7,1 ) ) DAY ) and NOW()

但这会产生 SQL 语法错误。我要做的是一个子查询和按日期分组以每天获得一个结果,并从偏移量 7 开始返回一个结果,然后在其上执行 DATEDIFF 以获得 DATE_SUB 应该的天数输入INTERVAL x DAYS

【问题讨论】:

  • 你看过其他相关的 Stack Overflow 帖子吗? Selecting the last 7 days from Now() in MYSQL
  • @Aiias 这是朝着正确方向迈出的一步。我不需要最后 7 天,我只需要实际上有某些东西的最后 7 天,如果这 20 天中只有 7 天输入了数据,这实际上可能是最后 20 天。如果我能算出要返回多少天,那么我可以使用 BETWEEN。

标签: php mysql


【解决方案1】:

您将无法以数组的形式返回同一天的结果,但您可以按日期对它进行分组,标题用逗号分隔:

SELECT GROUP_CONCAT(title) AS titles, date 
FROM test 
WHERE date > DATE_SUB(CURDATE(), INTERVAL 7 DAY)
GROUP BY date;

然后在 PHP 中,执行如下操作:

foreach ($results as $row)
{
    echo $row['date'];
    foreach ($row['titles'] as $title)
    {
        echo $title;
    }
}

【讨论】:

  • 这将得到过去 7 天的所有内容,这不是我想要的。我想要的只是最后 7 天,里面有任何东西。此查询不检查当天是否有行。
  • @eablokker 就我而言,如果某一天没有条目,那么那一天不会发布任何内容,也不会显示那一天,所以你想要的是,如果任何过去 7 天没有条目,直到您有 7 天的数据才会返回另一天?
  • @eablocker 你运行查询了吗?任何没有任何内容的日子(即空白行)将不会被返回,因为它们不存在。编辑 - 啊,我现在明白了;您需要 7 天的数据,而不是过去 7 天的数据。不清楚,抱歉。
  • 是的,我希望它继续运行,直到获得 7 天的数据。我用子查询弄明白了。
【解决方案2】:

想通了:它有效!

WHERE Date BETWEEN DATE_SUB(NOW(), INTERVAL (DATEDIFF( NOW(), (SELECT Date FROM test GROUP BY Date ORDER BY Date DESC LIMIT 8,1 ) ) ) DAY) and NOW()

我少了一个括号,我不得不将 ORDER BY 和 DESC 添加到子查询中。

【讨论】:

    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多