Это будет не красиво (вы можете добавить функции для удобства чтения ваших запросов, если вы собираетесь делать это много)
Если у вас нет логинов, которыеВ течение нескольких дней вы можете выполнить следующие действия:
SELECT
user_id,
SUM(
TIMESTAMPDIFF(SECOND,
CASE
WHEN sessions.checkin < timestamp(date(sessions.checkin), maketime(9,0,0))
THEN timestamp(date(sessions.checkin), maketime(9,0,0))
WHEN sessions.checkin > timestamp(date(sessions.checkin), maketime(18,0,0))
THEN timestamp(date(sessions.checkin)+1, maketime(9,0,0))
ELSE
sessions.checkin
END,
CASE
WHEN IFNULL(sessions.checkout, now()) > timestamp(date(IFNULL(sessions.checkout, now())), maketime(18,0,0))
THEN timestamp(date(IFNULL(sessions.checkout, now())), maketime(18,0,0))
WHEN IFNULL(sessions.checkout, now()) < timestamp(date(IFNULL(sessions.checkout, now())), maketime(9,0,0))
THEN timestamp(date(IFNULL(sessions.checkout, now()))-1, maketime(18,0,0))
ELSE
IFNULL(sessions.checkout, now())
END)) AS score
FROM `sessions`
GROUP BY `user_id`
. Это не работает, если входы в систему, которые охватывают несколько дней или, если быть точным, запрос могут работать с входами в систему, которые охватывают несколько дней, например, регистрация в 18:05 в первыйдень и оформить заказ в 8:55 на третий день, но как только он переходит в исчисляемое время в несколько дней, вычисление не заканчивается - для каждой записи, которая охватывает счетное время в течение нескольких дней, необходимо вычесть количество неисчислимых секунд изрезультат.Дайте мне знать, если вам нужна помощь.
Вышеупомянутый запрос должен выполняться относительно дешево - учитывая тот факт, что вы выполняете его по всей таблице в любом случае , поэтому он будет выполнять таблицусканирование, тот факт, что много повторных вычислений и что он выглядит огромным, не должен иметь большого значения.Эти вычисления выполняются в памяти без дополнительных операций ввода-вывода, и это должно произойти на несколько порядков быстрее, чем дисковые операции ввода-вывода (сравните со временем выполнения исходного запроса и дайте нам знать, если вы заметите какое-либо снижение производительности).