sql >> Database teknologi >  >> RDS >> Mysql

indsæt eller udelad indgange i mysql-forespørgsel baseret på resultaternes betingelser

Hvis du har brug for at finde ud af, hvilke poster der repræsenterer et login uden en matchende logout-post og omvendt, ville det være nyttigt at udvide dine tabeller med et unikt sessions-id. Tilføj en kolonne session_id , generer dens værdi ved login, husk den i sessionen og indsæt den samme værdi til session_id for logout-fejlen. Det ville forenkle forespørgslerne meget.

Hvis du har brug for en forespørgsel, der vil tilføje manglende login-poster, kan du prøve følgende:

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

(Violin .) Du kan enten indsætte resultatet i tabellen (INSERT INTO logs (...) SELECT ... ) eller tilføj forespørgslen til UNION i din oprindelige forespørgsel.

Som bemærket af @OlivierCoilland bliver forespørgslen ret kompleks, og du kan overveje analyse på applikationssiden. Fordi jeg gætter på, at logtabellen er ret stor, bør du ikke stole på, at du vil passe alle indgange i hukommelsen. Du ville sandsynligvis have brug for en form for "skydevindue"-teknik.

Den fjerde mulighed er at slette uovertrufne logout-poster. Min løsning har brug for en midlertidig tabel, så jeg indsætter ikke hele (temmelig lange) kode her, bare se violin .




  1. Ønsker at sætte MySql-grænse på hver hvor betingelse

  2. Ukendt kolonnefejl i fuld joinsyntaks

  3. Brug af mySql via proxy-kast Forårsaget af:java.sql.SQLEundtagelse:Kaldbare sætninger understøttes ikke. efter gentilslutning

  4. Hvorfor er mysql_escape_string stærkt frarådt?