sql >> Database >  >> RDS >> Mysql

invoegen of weglaten van vermeldingen in mysql-query op basis van de voorwaarden van resultaten

Als u wilt detecteren welke records een login vertegenwoordigen zonder een overeenkomend uitlogrecord en vice versa, dan zou het handig zijn om uw tabellen uit te breiden met een unieke sessie-ID.Voeg een kolom toe session_id , genereer de waarde ervan bij het inloggen, onthoud het in de sessie en geef dezelfde waarde op session_id voor de uitlogfout. Het zou de zoekopdrachten veel vereenvoudigen.

Als je een zoekopdracht nodig hebt die ontbrekende inloggegevens zou toevoegen, probeer dan het volgende:

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

(Fiddle .) U kunt het resultaat in de tabel invoegen (INSERT INTO logs (...) SELECT ... ) of voeg de zoekopdracht toe aan de UNION in uw oorspronkelijke zoekopdracht.

Zoals opgemerkt door @OlivierCoilland, wordt de vraag behoorlijk complex en kun je analyse aan de kant van de applicatie overwegen. Omdat ik denk dat de logtabel behoorlijk groot is, moet je er niet op vertrouwen dat je alle gegevens in het geheugen kunt plaatsen. Je hebt waarschijnlijk een soort van "schuifraam"-techniek nodig.

De vierde optie is het verwijderen van ongeëvenaarde uitlogrecords. Mijn oplossing heeft een tijdelijke tabel nodig, dus ik plak hier niet de hele (behoorlijk lange) code, kijk gewoon naar de viool .




  1. Vind waarden die geen getallen bevatten in MySQL

  2. Hoe MySQL-database op afstand verbinden met Python+SQLAlchemy?

  3. UTF8-tekens worden niet correct weergegeven met gegevenstabellen en yadcf

  4. mysql:hoe de lengte van een veld af te kappen?