sql >> Databasteknik >  >> RDS >> Mysql

infoga eller utelämna poster i mysql-frågan baserat på resultatvillkor

Om du behöver upptäcka vilka poster som representerar en inloggning utan en matchande utloggningspost och vice versa, skulle det vara bra att utöka dina tabeller med ett unikt sessions-ID. Lägg till en kolumn session_id , generera dess värde vid inloggning, kom ihåg det i sessionen och sätt samma värde till session_id för utloggningsfelet. Det skulle förenkla frågorna mycket.

Om du behöver en fråga som skulle lägga till saknade inloggningsposter, prova följande:

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

(Fiol .) Du kan antingen infoga resultatet i tabellen (INSERT INTO logs (...) SELECT ... ) eller lägg till frågan i UNION i din ursprungliga fråga.

Som noterat av @OlivierCoilland blir frågan ganska komplex och du kan överväga analys på applikationssidan. Eftersom jag antar att loggtabellen är ganska stor, bör du inte lita på att du får plats med alla poster i minnet. Du skulle förmodligen behöva någon form av "skjutfönster"-teknik.

Det fjärde alternativet är att ta bort omatchade utloggningsposter. Min lösning behöver en tillfällig tabell, så jag klistrar inte in hela (ganska långa) koden här, se bara fiol .




  1. Skapa tillfälliga tabeller i MySQL Stored Procedure

  2. Favorittrick för att trimma prestanda

  3. macOS Connector/MySQL ODBC-drivrutin kunde inte laddas i Excel för Mac 2016

  4. Bästa sättet att lagra arbetstider och fråga dem effektivt