2016-04-11 4 views
1

У меня есть две таблицы со следующей структурой:MySQL фильтр по дате последней записи

Table items: 

- id (int) 

Table item_events: 

- item_id (int) 
- created_at (DateTime) 

Каждый элемент может иметь ноль, один или несколько item_events. Мне нужно найти все предметы, у которых последние item_event был создан между двумя конкретными датами. До знаю, я построил следующий SQL-запрос:

SELECT DISTINCT `items`.* 
FROM `items` INNER JOIN `item_events` ON `items`.`id` = `item_events`.`item_id` 
WHERE (item_events.created_at >= '2016-01-01 00:00:00') AND (item_events.created_at <= '2016-01-05 23:59:59'); 

Однако этот запрос выбирает любой элемент, который имеет item_event между указанными датами, даже если это item_event не последний связан с элементом. Любая помощь будет оценена по достоинству.

ответ

4

Вы можете использовать производную таблицу, которая содержит последнюю created_at значение на item_id:

SELECT `items`.* 
FROM `items` 
INNER JOIN (
    SELECT `item_id`, MAX(`created_at`) AS `created_at` 
    FROM `item_events` 
    GROUP BY `item_id` 
) AS `item_events` ON `items`.`id` = `item_events`.`item_id` 
WHERE (item_events.created_at >= '2016-01-01 00:00:00') AND 
     (item_events.created_at <= '2016-01-05 23:59:59'); 
Смежные вопросы