sql >> データベース >  >> RDS >> Mysql

結果の条件に基づいて、mysqlクエリのエントリを挿入または省略します

    一致するログアウトレコードのないログインを表すレコードを検出する必要がある場合、またはその逆の場合は、一意のセッション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番目のオプションは、一致しないログアウトレコードを削除することです。私のソリューションには一時的なテーブルが必要なので、ここに(かなり長い)コード全体を貼り付けるのではなく、フィドル




    1. SQL ServerでのDB_NAME()のしくみ

    2. 今年の最初と最後の日付を取得するにはどうすればよいですか?

    3. HTMLFORMから定義された変数に基づいてMYSQLUPDATEステートメントを動的に生成する方法

    4. データベースから最も近い(距離)レコードを効果的に選択する