一致するログアウトレコードのないログインを表すレコードを検出する必要がある場合、またはその逆の場合は、一意のセッションIDを使用してテーブルを拡張すると便利です。列session_id
を追加します。 、ログイン時にその値を生成し、セッションでそれを記憶し、同じ値をsession_id
に入力します ログアウトエラーの場合。クエリが大幅に簡素化されます。
不足しているログインレコードを追加するクエリが必要な場合は、次のことを試してください。
SELECT 0 AS idLoginnLog, l1.username, ADDTIME(l1.time, '-0:30:0') AS time, 1 AS type
FROM logs AS l1
LEFT JOIN logs AS l2
ON (l1.username=l2.username AND l2.type=1 AND l2.time BETWEEN ADDTIME(l1.time, '-0:30:0') AND l1.time)
WHERE
l1.type=0
AND l2.idLoginLog IS NULL
(フィドル
。)結果をテーブルに挿入することができます(INSERT INTO logs (...) SELECT ...
)または、元のクエリのUNIONにクエリを追加します。
@OlivierCoillandが指摘しているように、クエリはかなり複雑になっており、アプリケーション側での分析を検討できます。ログテーブルはかなり大きいと思うので、すべてのエントリをメモリに収めることに頼るべきではありません。おそらく、ある種の「スライディングウィンドウ」テクニックが必要になるでしょう。
4番目のオプションは、一致しないログアウトレコードを削除することです。私のソリューションには一時的なテーブルが必要なので、ここに(かなり長い)コード全体を貼り付けるのではなく、フィドル 。