【问题标题】:Limit MYSQL search results to dates greater than variable将 MYSQL 搜索结果限制为大于变量的日期
【发布时间】:2020-09-18 20:34:47
【问题描述】:

我有一个 MYSQL 表 posts,其中包含一个 VARCHAR(25)created,其中填充了格式为 XXXX-XX XX:XX:XX 的日期时间。我正在尝试按日期搜索 > 现在 - 24 小时。

//get the timestamp for now - 24 hours
$timeAgo=date("Y-m-d H:i:s", strtotime('-24 hours'));
//outputs something like 2020-09-17 12:32:44

//search for all posts that meet the criteria
$sql = "SELECT posts.*
        FROM posts
        WHERE posts.uuid='uuid1' 
        OR posts.uuid='uuid2' 
        OR posts.uuid='uuid3'
        AND posts.created > '$timeAgo'
        ORDER BY posts.id DESC
        ";

仅使用一个 posts.uuid 进行搜索时,我得到了所需的结果,其中列出了该 uuid 在过去 24 小时(或其他指定时间)内的所有帖子。

当我使用上面代码块中引用的多个 uuid 进行搜索时,我得到了不想要的结果,其中列出了来自各个 uuid 的所有帖子,无论它们是何时创建的。

如何搜索过去 24 小时(或其他指定时间)内有多个 posts.uuids 的所有帖子?

【问题讨论】:

  • 为什么将日期时间存储为 varchar 是我不明白的。为什么不使用DATETIME 作为类型?这将使查询变得更加容易。
  • 感谢您的反馈。感谢您的提示。

标签: php mysql sql datetime where-clause


【解决方案1】:

OR 条件周围需要括号:

WHERE 
    (posts.uuid='uuid1' OR posts.uuid='uuid2' OR posts.uuid='uuid3')
    AND posts.created > '$timeAgo'

理由:AND 的优先级高于OR,因此不带括号的表达式等价于:

WHERE 
    posts.uuid='uuid1' 
    OR posts.uuid='uuid2' 
    OR (posts.uuid='uuid3' AND posts.created > '$timeAgo')

使用IN更简单:

WHERE posts.uuid in ('uuid1', 'uuid2', 'uuid3') AND posts.created > '$timeAgo'

请注意,您可以直接在查询中而不是在 PHP 中计算日期。此外,您不需要在列前加上表名,因为查询中只涉及一张表。我会这样写:

SELECT *
FROM posts
WHERE uuid IN ('uuid1', 'uuid2', 'uuid3') AND created > now() - interval 1 day
ORDER BY id DESC

【讨论】:

  • 接受这个答案。感谢您的快速回复和额外的解释,非常有帮助!也感谢推荐 IN 评论的第二次编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多