2016-08-18 151 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`