Ако трябва да откриете кои записи представляват влизане без съвпадащ запис за излизане и обратно, тогава би било полезно да разширите таблиците си с уникален идентификатор на сесията. Добавете колона 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
(Fiddle
.) Можете или да вмъкнете резултата в таблицата (INSERT INTO logs (...) SELECT ...
) или добавете заявката към UNION в първоначалната си заявка.
Както отбелязва @OlivierCoilland, заявката става доста сложна и можете да помислите за анализ от страна на приложението. Тъй като предполагам, че таблицата на журнала е доста голяма, не трябва да разчитате, че ще поберете всички записи в паметта. Вероятно ще ви трябва някаква техника на "плъзгащ се прозорец".
Четвъртата опция е изтриване на несравними записи за излизане. Моето решение се нуждае от временна таблица, така че не поставям целия (доста дълъг) код тук, просто вижте цигулка .