2017-02-10 33 views
0

Ich schreibe ein CMS für einen Kunden, der eine Sortierung seiner Daten durch bevorstehende Aktivitäten wünscht.SQL Listet Daten aus einer Tabelle abhängig von Daten aus einer anderen Tabelle

Es gibt eine Tabelle mit dem Namen customers, die alle Kunden enthält, die durch die Spalte cust_id identifiziert werden.

Es gibt auch eine Tabelle mit dem Namen activities, in der es eine Spalte cust_id gibt, die mit einem Kunden verknüpft werden soll, und ein Feld date_last_done, das angibt, wann die Aufgabe abgeschlossen wurde. Der Kunde kann viele Aktivitäten auf seinem Konto haben.

Ich möchte alle Kunden abholen, wo die letzte Aktivität (date_last_done desc) vor mehr als 11 Monaten abgeschlossen wurde.

Hier ist mein Versuch:

SELECT 
    * 
FROM 
    customers 
INNER JOIN 
    activities 
ON 
    activities.cust_id = customers.cust_id 
WHERE 
    (SELECT 
     date_last_done 
    FROM 
     activities 
    WHERE 
     cust_id = ??? 
    ORDER BY 
     date_last_done 
    DESC) 
    < date() - 11months 

Wie würde ich meine Abfrage bearbeiten, dies zu tun?

Antwort

1

Verbinden Sie die customers Tabelle mit einer Unterabfrage, die die Kunden mit Aktivitäten zurückgibt, die den Kriterien entsprechen.

SELECT c.* 
FROM customers AS c 
JOIN (SELECT cust_id 
     FROM activities 
     GROUP BY cust_id 
     HAVING MAX(date_last_done) < DATE_SUB(NOW(), INTERVAL 11 MONTH)) AS a 
ON c.cust_id = a.cust_id 
+0

Fantastische Antwort - Ich habe diese Logik nicht zuvor verwendet. Es gibt ein Problem mit einer fehlenden Klammer kurz vor dem 'AS a ON c.cust_id'. Außerdem wird ein Fehler ausgegeben, der besagt, dass 'FUNCTION db.MAX()' nicht existiert. –

+0

Fixed die fehlende Klammer, nicht sicher über den Fehler, obwohl. Stellen Sie sicher, dass hinter 'MAX' kein Leerzeichen steht. – Barmar

+0

Spot auf. PHPMyAdmin formatierte das SQL und fügte dort eine neue Zeile hinzu. Danke vielmals! –

Verwandte Themen