2016-08-18 04:52:14是我从数据库中获取的时间戳,以便跟踪我想要加载更多小于此值的记录
这是代码
foreach($explode as $stat){
if($statement == ""){
$statement .= "`userid` = '$stat'";
}else{
$statement .= "OR `userid` = '$stat'";
}
}
}
$result = $link->query("SELECT * FROM `things` WHERE $statement AND `times` < '$time' ORDER BY `times` DESC LIMIT 20");
times
是我试图查询的时间戳字段,但它返回的日期大于该
例如
id--------------times
63 8/18/2016 1:25:43 AM
---
---
---
---
---
93 8/18/2016 6:41:12 AM
所以$ time变量是2016-08-18 04:52:14但它返回行93下限20,我真的可以使用一些建议谢谢你的时间
答案 0 :(得分:4)
可能是因为您的查询中使用OR
和AND
的条件。
SELECT * FROM `things`
WHERE ($statement)
AND `times` < '$time'
ORDER BY `times` DESC
LIMIT 20"
通过在$statement
周围添加括号,您可以避免将OR
附加到时间比较中。
<强>解释强>
我很确定发生了什么,如果你调试PHP构建的实际查询,它看起来像这样:
WHERE `user_id` = 1 OR `user_id` = 2 AND `times` < '2016-08-18 04:52:14'
因此,此示例中的第二个user_id
被视为times
条件的一部分,如下所示:
WHERE
(`user_id` = 1)
OR
(`user_id` = 2 AND `times` < '2016-08-18 04:52:14')
你真正想要的是:
WHERE
(`user_id` = 1 OR `user_id` = 2)
AND
(`times` < '2016-08-18 04:52:14')
其他改进
无论如何,您可以使用SQL IN
运算符替代它,这使您的代码更优雅,更易于阅读。
因此,如果您的用户ID使用逗号分隔的字符串或其他内容,请不要对它们进行爆炸(因为我假设您已从代码中完成)。只需将它们传递给查询:
$userIds = "1, 2, 3, 4";
$sql = "SELECT *
FROM `things`
WHERE `user_id` IN($userIds)
AND `times` < '$time'
ORDER BY `times` DESC
LIMIT 20";
答案 1 :(得分:0)
尝试将您的$ time转换为unixtimestamp并查询如下:
WHERE $statement AND UNIX_TIMESTAMP(`times`) < '$time' ORDER BY `times`