You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL多UUID查询:如何限制结果为24小时内的记录?

问题分析与解决方案

你碰到的问题核心是SQL运算符优先级搞的鬼:MySQL里AND的优先级比OR高,所以你原来的查询语句实际执行逻辑是这样的:

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

这就导致前两个uuid对应的所有记录都会被返回,完全不受时间条件的限制。

修复方案

方案1:用括号包裹OR条件,让时间规则覆盖所有uuid

把所有uuid的判断用括号括起来,让它们作为一个整体,再和时间条件做AND运算,这样所有指定uuid的记录都会先被筛选,再应用时间限制:

// 时间戳逻辑保持不变
$timeAgo=date("Y-m-d H:i:s", strtotime('-24 hours'));

// 修正后的SQL语句
$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 ";

方案2:用IN运算符简化多uuid判断(更推荐)

面对多个uuid的判断场景,IN运算符能让代码更简洁易读,效果和括号包裹OR完全一致:

$timeAgo=date("Y-m-d H:i:s", strtotime('-24 hours'));
$sql = "SELECT posts.* FROM posts 
WHERE posts.uuid IN ('uuid1', 'uuid2', 'uuid3') 
AND posts.created > '$timeAgo' 
ORDER BY posts.id DESC ";

额外提醒:防范SQL注入

直接把变量拼接到SQL语句里存在SQL注入风险,建议用PHP的预处理语句(PDO或mysqli)绑定参数,这里给个PDO的示例:

$uuids = ['uuid1', 'uuid2', 'uuid3'];
$timeAgo=date("Y-m-d H:i:s", strtotime('-24 hours'));

// 构建参数占位符
$placeholders = implode(',', array_fill(0, count($uuids), '?'));

// 初始化PDO连接
$pdo = new PDO('mysql:host=localhost;dbname=你的数据库名', '用户名', '密码');
$stmt = $pdo->prepare("SELECT posts.* FROM posts WHERE uuid IN ($placeholders) AND created > ? ORDER BY id DESC");

// 绑定并执行参数
$params = array_merge($uuids, [$timeAgo]);
$stmt->execute($params);

// 获取查询结果
$posts = $stmt->fetchAll(PDO::FETCH_ASSOC);

内容的提问来源于stack exchange,提问作者user1129107

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:17:40