简体   繁体   English

MySQL按最后记录的日期过滤

[英]MySQL filter by date of last record

I have two tables with the following structure: 我有两个具有以下结构的表:

Table items:

 - id (int)

Table item_events:

 - item_id (int)
 - created_at (DateTime)

Each item can have zero, one or more item_events. 每个项目可以有零个,一个或多个item_events。 I need to find all the items whose last item_event was created between two specific dates. 我需要找到所有最后一个 item_event在两个特定日期之间创建的项目。 Up to know I have built the following SQL query: 据了解,我已经建立了以下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');

However, this query is selecting any item that has an item_event between the given dates, even though this item_event is not the last one related to the item. 但是,此查询将选择在给定日期之间具有item_event的任何项目,即使该item_event不是与该项目相关的最后一个项目。 Any help would be appreciated. 任何帮助,将不胜感激。

You can use a derived table that contains the latest created_at value per item_id : 您可以使用包含每个item_id最新的created_at值的派生表:

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');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM