查询 where timestamp < timestamp 不起作用?

query where timestamp < timestamp not working?

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,我真的可以使用一些建议谢谢你的时间

这可能是因为您使用 ORAND 的查询条件。

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";

尝试将您的 $time 转换为 unixtimestamp 并像这样查询:

WHERE $statement AND UNIX_TIMESTAMP(`times`) < '$time' ORDER BY `times`