2016-05-21 6 views
0

これに似た質問がたくさんあることは知っていますが、私の問題にはまったく問題がないようです。私はこの問題を研究するのにかなりの時間を費やし、最後のイメージを選択しないクエリを思いつきました。画像多対多の関係で一番大きいn

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

テーブル::、offer_imagesだから、

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

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

とそれらを接続するテーブルを提供していますので、問題は3つのテーブル

テーブルを持っています質問は: 最新の画像を含むすべてのクーポンを選択するにはどうすればよいですか(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

同じオファーを何度も返します –