我有两个具有以下结构的表:
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不是与项目相关的最后一项。任何帮助将不胜感激。
答案 0 :(得分: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');