将MYSQL搜索结果限制为大于变量的日期



我有一个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的所有帖子,无论它们是何时创建的。

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

OR条件周围需要括号:

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

理由:ANDOR具有更高的先见之明,因此如果没有括号,该表达式等效于:

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

最新更新