2016-05-21 39 views
0

我知道有很多類似這個問題的問題,但似乎沒有什麼符合我的問題。我花了好幾個小時來研究這個問題,並提出了一個不會選擇最後一張圖片的查詢,稍後會有更多內容。那麼,問題是有3個表在多對多關係中每組最多n

表:圖像

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

表:提供

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

和連接它們的表:offer_images

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

因此,問題是: 如何選擇包含上次更新映像的所有商品(基於updated_at)來自與報價鏈接的圖像表。以下是我走到這一步:

SELECT `o`.*, `i`.`filename` 
FROM `offer_images` AS `oi` 
INNER JOIN `offers` AS `o` on `oi`.`offer_id` = `o`.`id` 
INNER JOIN `images` as `i` on `oi`.`photo_id` = `i`.`id` 
GROUP BY `o`.`id` 

查詢選擇一切,它的工作除了它忽略了的updated_at領域。

+0

換句話說,給定一個看起來像這樣的數據集...我想要一個看起來像這樣的結果... – Strawberry

回答

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 

查詢使用派生表,讓每offer_id最新update_at日期。使用這個日期,我們可以回到images表,以獲得最大的每組記錄。

+0

它會多次返回相同的優惠 –