У меня есть следующая таблица:
CREATE TABLE IF NOT EXISTS `access_log` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL DEFAULT 0,
`room_id` INT(11) NOT NULL DEFAULT 0,
`created` TIMESTAMP NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Новая запись добавляется каждый раз, когда пользователь входит в комнату room_id
.Я хотел бы выбрать первую и последнюю запись каждого пользователя для каждой комнаты.
В настоящее время у меня есть следующие запросы, которые не дают правильных записей:
Для первая запись каждой комнаты для каждого пользователя:
SELECT al.* FROM `access_log` AS `al`
LEFT JOIN `rooms` AS `r` ON al.room_id = r.id
INNER JOIN (
SELECT user_id, room_id, min(created) AS min_date
FROM `access_log`
WHERE `user_id` != 0
GROUP BY user_id, room_id) AS al2
ON al.user_id = al2.user_id AND al.room_id = al2.room_id AND al.created = al2.min_date
WHERE `al`.`created` >= '2019-06-09 00:00:00' AND `al`.`created` <= '2019-06-12 23:59:59'
для последняя запись каждой комнаты для каждого пользователя:
SELECT al.* FROM `access_log` AS `al`
LEFT JOIN `rooms` AS `r` ON al.room_id = r.id
INNER JOIN (
SELECT user_id, room_id, max(created) AS max_date
FROM `access_log`
WHERE `user_id` != 0
GROUP BY user_id, room_id) AS al2
ON al.user_id = al2.user_id AND al.room_id = al2.room_id AND al.created = al2.max_date
WHERE `al`.`created` >= '2019-06-09 00:00:00' AND `al`.`created` <= '2019-06-12 23:59:59'
Вот демонстрация SQLFiddleвключая примеры данных http://www.sqlfiddle.com/#!9/fc5f8b/2. Вы видите, что запрос отображает непредвиденные результаты.Они не перечисляют разные дни, хотя они перечисляют разные комнаты.Кроме того, количество строк для первого и последнего запросов различается.
одинаковые DDL:
CREATE TABLE IF NOT EXISTS `access_log` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL DEFAULT 0,
`room_id` INT(11) NOT NULL DEFAULT 0,
`created` TIMESTAMP NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `access_log` (`id`, `user_id`, `room_id`, `created`) VALUES
(1, 90000017, 6, '2019-06-10 01:15:00'),
(2, 90000017, 6, '2019-06-10 01:25:00'),
(3, 90000018, 6, '2019-06-10 02:15:00'),
(4, 90000018, 6, '2019-06-10 02:25:00'),
(5, 90000019, 6, '2019-06-10 03:15:00'),
(6, 90000019, 6, '2019-06-10 03:25:00'),
(7, 90000017, 5, '2019-06-10 11:15:00'),
(8, 90000017, 5, '2019-06-10 11:25:00'),
(9, 90000018, 5, '2019-06-10 12:15:00'),
(10, 90000018, 5, '2019-06-10 12:25:00'),
(11, 90000019, 5, '2019-06-10 13:15:00'),
(12, 90000019, 5, '2019-06-10 13:25:00'),
(13, 90000017, 6, '2019-06-11 04:10:00'),
(14, 90000017, 6, '2019-06-11 04:20:00'),
(15, 90000018, 6, '2019-06-11 05:10:00'),
(16, 90000018, 6, '2019-06-11 05:20:00'),
(17, 90000019, 6, '2019-06-11 06:10:00'),
(18, 90000019, 6, '2019-06-11 06:20:00'),
(19, 90000017, 5, '2019-06-11 14:10:00'),
(20, 90000017, 5, '2019-06-11 14:20:00'),
(21, 90000018, 5, '2019-06-11 15:10:00'),
(22, 90000018, 5, '2019-06-11 15:20:00'),
(23, 90000019, 5, '2019-06-11 16:20:00'),
(24, 90000019, 5, '2019-06-11 16:20:00');
Ожидаемые результаты должны быть примерно такими:
First per user per room per day
+------+-----------+---------+---------------------+
| id | user_id | room_id | created |
+------+-----------+---------+---------------------+
| 1 | 90000017 | 6 | 2019-06-10 01:15:00 |
| 3 | 90000018 | 6 | 2019-06-10 02:15:00 |
| 5 | 90000019 | 6 | 2019-06-10 03:15:00 |
| 7 | 90000017 | 5 | 2019-06-10 11:15:00 |
| 9 | 90000018 | 5 | 2019-06-10 12:15:00 |
| 11 | 90000019 | 5 | 2019-06-10 13:15:00 |
| 13 | 90000017 | 6 | 2019-06-11 04:10:00 |
| 15 | 90000018 | 6 | 2019-06-11 05:10:00 |
| 17 | 90000019 | 6 | 2019-06-11 06:10:00 |
| 19 | 90000017 | 5 | 2019-06-11 14:10:00 |
| 21 | 90000018 | 5 | 2019-06-11 15:10:00 |
| 23 | 90000019 | 5 | 2019-06-11 16:20:00 |
+------+-----------+---------+---------------------+
Last per user per room per day
+------+-----------+---------+---------------------+
| id | user_id | room_id | created |
+------+-----------+---------+---------------------+
| 2 | 90000017 | 6 | 2019-06-10 01:25:00 |
| 4 | 90000018 | 6 | 2019-06-10 02:25:00 |
| 6 | 90000019 | 6 | 2019-06-10 03:25:00 |
| 8 | 90000017 | 5 | 2019-06-10 11:25:00 |
| 10 | 90000018 | 5 | 2019-06-10 12:25:00 |
| 12 | 90000019 | 5 | 2019-06-10 13:25:00 |
| 14 | 90000017 | 6 | 2019-06-11 04:20:00 |
| 16 | 90000018 | 6 | 2019-06-11 05:20:00 |
| 18 | 90000019 | 6 | 2019-06-11 06:20:00 |
| 20 | 90000017 | 5 | 2019-06-11 14:20:00 |
| 22 | 90000018 | 5 | 2019-06-11 15:20:00 |
| 24 | 90000019 | 5 | 2019-06-11 16:20:00 |
+------+-----------+---------+---------------------+