2017-08-02 9 views
1

私は意図したように動作するために使用されていたmysqlクエリを持っていたが、今は何かが起こったと思うし、もう動作しないようだ。壊れたままで左に参加しますか?

私が持っているものは、参加したい2つのテーブルです。 を持っていないユーザーが "表」で

ユーザー

ログ

私は、すべてのユーザーIDの(UID)のリストが欲しいです"が今日ログインしました。このクエリを使用しました。

SELECT users.UID 
FROM users 
LEFT JOIN logs 
    ON users.UID = logs.UID 
AND DATE(logs.SCANTIME)=DATE(SYSDATE()) 
WHERE logs.UID is null 

上記のクエリは以前は使用されていましたが、ここには存在しないUIDのリストが返されます。

今日はログを調べると複数の行が表示されますが、スペースを節約するために1つを除いてすべてを省略しています。

mysql> SELECT UID, SCANTIME FROM logs WHERE DATE(scantime)=DATE(SYSDATE()); 
    +------------+---------------------+ 
    | UID  | SCANTIME   | 
    +------------+---------------------+ 
    ............. 
    | AA9B351B | 2017-08-02 06:13:21 | 
    ............. 
    +------------+---------------------+ 
    63 rows in set (0.00 sec) 

だから、この男のAA9B351Bは明らかに今日ログインしています。しかし、私は上記のクエリを実行すると、彼は表示されます。すべての返信をありがとう

+0

@Dhruv Saxena - LEFT JOINはすべてのユーザーを返しますが、WHERE句は使用しません。結果をフィルタリングして、該当するユーザーのみが返されます。 – BusinessPlanQuickBuilder

+0

クエリが正常に見えます。 'sysdate()'の値は、クライアントとサーバが異なる時刻を持ち、いくつかのポイントとレベルでタイムゾーンを設定/上書きできることを考慮すると、値は厳密です。それに加えて、クエリの結果に影響するサーバー側の構成はほとんどありません。 – Sal

+0

2つの可能性があります。 1)時間(logs.scantime)が、 '6時00分'と思われるものを返していないときは、'01:00 'と比較しています。比較は「時間」データ型ではなく文字列レベルです。 2)そのユーザーのログに複数のレコードがある。少なくとも1つは今日のものですが、01:00以前と12:00以降です。 01:00から12:00の間にログインしているユーザーのみを表示することを目標とする場合は、他のメンバーが示すように内部結合がより適切です。あなたは何をしようとしていますか?何時間かの範囲で今日ログインしていないすべてのユーザーを検索しますか? – xQbert

答えて

0

サーバーの時刻が正しくない可能性がありますので、SYSDATEは誤った値を返しています。システム時間をチェックし、SYSDATE関数をリテラルに置き換えてSQLクエリを実行します(テストするだけです)。また、このチェックに関連して、タイムゾーンは変更されていません。サーバーの時刻が間違っている場合は、リセットします。

関連する問題