查询时间戳<时间戳无法正常工作?

时间:2016-08-18 12:45:42

标签: php mysql timestamp where

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

2 个答案:

答案 0 :(得分:4)

可能是因为您的查询中使用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";

答案 1 :(得分:0)

尝试将您的$ time转换为unixtimestamp并查询如下:

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