Mysql
 sql >> Baza danych >  >> RDS >> Mysql

wstawiaj lub pomijaj wpisy w zapytaniu mysql na podstawie warunków wyników

Jeśli chcesz wykryć, które rekordy reprezentują logowanie bez pasującego rekordu wylogowania i odwrotnie, warto rozszerzyć tabele o unikalny identyfikator sesji. Dodaj kolumnę session_id , wygeneruj jego wartość przy logowaniu, zapamiętaj ją w sesji i umieść tę samą wartość w session_id dla błędu wylogowania. To znacznie uprościłoby zapytania.

Jeśli potrzebujesz zapytania, które doda brakujące rekordy logowania, spróbuj wykonać następujące czynności:

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

(Skrzypce .) Możesz wstawić wynik do tabeli (INSERT INTO logs (...) SELECT ... ) lub dodaj zapytanie do UNION w pierwotnym zapytaniu.

Jak zauważył @OlivierCoilland, zapytanie staje się dość złożone i można rozważyć analizę po stronie aplikacji. Ponieważ myślę, że tablica dziennika jest dość duża, nie powinieneś polegać na tym, że zmieścisz wszystkie wpisy w pamięci. Prawdopodobnie potrzebujesz techniki „przesuwanego okna”.

Czwartą opcją jest usuwanie niezgodnych rekordów wylogowania. Moje rozwiązanie potrzebuje tymczasowej tabeli, więc nie wklejam tutaj całego (dość długiego) kodu, wystarczy zobaczyć skrzypce .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawić, by mysqli działał z DELIMITERami w instrukcjach SQL?

  2. Wyciek pamięci Java MySQL JDBC

  3. Jak tworzyć tymczasowe procedury w MySQL?

  4. Spring data JPA:pobieranie Nie znaleziono aliasów w wynikowej krotce! błąd podczas wykonywania niestandardowego zapytania

  5. Aktualizuj klienta C# za każdym razem, gdy baza danych jest aktualizowana