私は意図したように動作するために使用されていた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は明らかに今日ログインしています。しかし、私は上記のクエリを実行すると、彼は表示されます。すべての返信をありがとう
@Dhruv Saxena - LEFT JOINはすべてのユーザーを返しますが、WHERE句は使用しません。結果をフィルタリングして、該当するユーザーのみが返されます。 – BusinessPlanQuickBuilder
クエリが正常に見えます。 'sysdate()'の値は、クライアントとサーバが異なる時刻を持ち、いくつかのポイントとレベルでタイムゾーンを設定/上書きできることを考慮すると、値は厳密です。それに加えて、クエリの結果に影響するサーバー側の構成はほとんどありません。 – Sal
2つの可能性があります。 1)時間(logs.scantime)が、 '6時00分'と思われるものを返していないときは、'01:00 'と比較しています。比較は「時間」データ型ではなく文字列レベルです。 2)そのユーザーのログに複数のレコードがある。少なくとも1つは今日のものですが、01:00以前と12:00以降です。 01:00から12:00の間にログインしているユーザーのみを表示することを目標とする場合は、他のメンバーが示すように内部結合がより適切です。あなたは何をしようとしていますか?何時間かの範囲で今日ログインしていないすべてのユーザーを検索しますか? – xQbert