2016-08-18 94 views
1

2016年8月18日4时52分14秒的是,我从数据库中获取跟踪从那里我想加载更多记录这是小于查询where timestamp <timestamp not working?

此时间戳代码

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

+1

是什么列次datetype? – Jens

+0

@Jens它是时间戳 – JRowan

+0

我认为它与查询中日期的格式有关 – Jens

回答

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

奏效,你救了我的无奈哈哈 – JRowan

+0

的一个小时不知道什么都在$声明我要去这个感谢。有可能布尔逻辑不像op认为它应该那样工作,而且这可能会解决它,或者如果它把事情搞得更多,就会带来解决方案。接得好。 –

+1

再次非常感谢,我可以在一分钟之内接受,我一直强调这个约一个小时尝试所有不同种类的东西,再次感谢 – JRowan

0

尝试转换您的$时间unixtimestamp和查询,如:

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