2016-08-18 13 views
1

2016年8月18日4時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まで戻しています。私は本当にあなたの時間に感謝しています。

+1

列倍のDATETYPEは何ですか? – Jens

+0

@Jensタイムスタンプ – JRowan

+0

質問に日付の書式と関係があると思います – Jens

答えて

4

これは条件のためかもしれませんORANDを使用しているクエリであなたはORは時間比較に添付されるのを避けるかもしれないあなたの$statementの周りに括弧を置くことによって

SELECT * FROM `things` 
WHERE ($statement) 
    AND `times` < '$time' 
ORDER BY `times` DESC 
LIMIT 20" 


説明

私はあなたがPHPで構築されている実際のクエリをデバッグする場合、それは次のようになりますということで、何が起こっているかをかなり確信しています:

WHERE `user_id` = 1 OR `user_id` = 2 AND `times` < '2016-08-18 04:52:14' 

したがって、この例の第2のuser_idは、times条件の一部とみなされます。

あなたが実際に欲しい

は次のとおりです。

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

$ステートメントの中に何が入っているのか分からずに私はこれに行くつもりです。可能性はブール論理が動作しているように動作していないと思っています。これはこれを解決するか、それ以上の問題を解決すれば解決をもたらすでしょう。良いキャッチ。 –

+1

優れたおかげで再び、私は約1時間受け入れることができます。 – JRowan

0

はunixtimestampなどクエリするためにあなたの$時間を変換してみてください。

WHERE $statement AND UNIX_TIMESTAMP(`times`) < '$time' ORDER BY `times` 
関連する問題