在多对多关系中每组最大的n

时间:2016-05-21 15:36:07

标签: mysql many-to-many greatest-n-per-group

我知道有很多类似于这个的问题,但似乎没有什么适合我的问题。我花了相当多的时间研究这个问题,然后提出了一个不会选择最后一张图片的查询,稍后会详细介绍。所以,问题是有3个表

table:images

newdata

表:优惠

| Field             | Type             
+-------------------+------------------
| id                | int(10) unsigned 
| filename          | varchar(255)    
| created_at        | timestamp
| updated_at        | timestamp

和连接它们的表:offer_images

| Field             | Type             
+-------------------+------------------
| id                | int(10) unsigned  
| message           | varchar(255)    
| created_at        | timestamp

所以,问题是: 如何从链接到商品的图像表中选择包含上次更新图像(基于updated_at)的所有商品。这是我到目前为止所得到的:

| Field    | Type             
+----------+------------------
| offer_id | int(10) unsigned 
| image_id | int(10) unsigned

查询选择了所有内容,除了它忽略了updated_at字段之外它还在工作。

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT o.*, i.*
FROM offers AS o
INNER JOIN (
   -- Get the latest update_at date per offer_id
   SELECT oi.offer_id, MAX(updated_at) AS max_updated_at 
   FROM offer_images AS oi
   INNER JOIN images AS i ON oi.image_id = i.id
   GROUP BY oi.offer_id
) AS d ON o.id = d.offer_id
INNER JOIN offer_images AS oi ON oi.offer_id = d.offer_id
INNER JOIN images AS i ON i.id = oi.image_id AND i.updated_at = d.max_updated_at

该查询使用派生表来获取每update_at的最新offer_id日期。使用此日期,我们可以加入images表,以获得每组最大的记录。