2016-05-21 10 views
0

Ich weiß, dass es viele ähnliche Fragen gibt, aber es scheint, dass nichts zu meinem Problem passt. Ich habe einige Stunden damit verbracht, dieses Problem zu untersuchen, und habe eine Abfrage erstellt, die das letzte Bild nicht auswählt, dazu später mehr. So ist das Problem haben ein 3-TabellenGrößtes N pro Gruppe in einer Beziehung von vielen zu vielen

Tabelle: Bilder

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

Tabelle: bietet

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

und einen Tisch verbindet sie: offer_images

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

Also, die Frage ist: Wie wähle ich alle Angebote mit dem zuletzt aktualisierten Bild aus (basierend auf updated_at) aus der Bildtabelle, die mit dem Angebot verknüpft ist. Hier ist, was ich habe, so weit:

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` 

Die Abfrage wählt alles und es funktioniert außer dass es die updated_at Feld ignoriert.

+0

Mit anderen Worten, mit einem Datensatz, der so aussieht ... Ich möchte ein Ergebnis, das so aussieht ... – Strawberry

Antwort

0

Versuchen Sie folgendes:

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 

Die Abfrage verwendet eine abgeleitete Tabelle die neueste update_at Datum pro offer_id zu erhalten. Mit diesem Datum können wir uns wieder der Tabelle images anschließen, um den Datensatz mit der größten Anzahl an Gruppen zu erhalten.

+0

Es gibt die gleichen Angebote mehrmals zurück –

Verwandte Themen