2016-03-27 14 views
1

Ich habe die folgende AbfrageMit bevor Gruppe orderby von aus zwei verschiedenen Tabellen

SELECT 
    quote.id , 
    quote.createdAt, 
    status.status AS 'Status' 

FROM 
    quote 
     JOIN 
    quotelog ON quotelog.quote = quote.id 
     JOIN 
    status ON status.id = quotelog.status 

das Verhältnis zwischen Angebot und quotelog ist einer von vielen, was ich will, ist die neueste quotelog für das Angebot angezeigt werden soll.

Sowohl quote und quotelog haben created_at, ich zeige hier das Erstellungsdatum des Zitats.

das Ergebnis Während jedes Zitat mehrere Status haben, möchte ich nur die neueste eines für jedes Zitat

id createdAt Status 
1 07-12-15 6:14 newQuote 
2 07-12-15 6:40 newQuote 
2 07-12-15 6:40 quoteCancelled 
3 07-12-15 7:21 newQuote 
3 07-12-15 7:21 quotePaused 
4 07-12-15 8:17 newQuote 
4 07-12-15 8:17 quoteCompleted 

mit dem Hinzufügen von Gruppe I dieses

erhalten von quote.id bekommen
id createdAt Status 
1 07-12-15 6:14 newQuote 
2 07-12-15 6:40 newQuote 
3 07-12-15 7:21 newQuote 
4 07-12-15 8:17 newQuote 

Ich möchte es so aussehen

id createdAt Status 
1 07-12-15 6:14 newQuote 
2 07-12-15 6:40 quoteCancelled 
3 07-12-15 7:21 quotePaused 
4 07-12-15 8:17 quoteCompleted 

so was ich brauche, ist von qoutelog.createdAt zu bestellen, bevor sie von q Gruppierung uote.id

fand ich Antworten in Stackoverflow, aber sie nur mit einer Tabelle entweder mit HAVING nach Gruppe oder selbst beitreten Unterabfrageergebnis, das enthält, um durch oder mit ROW_NUMBER(), der Mysql nicht unterstützt

beschäftigen
+0

Erstens, wenn Sie noch nicht sind, speichern Sie Datumsangaben mit einem geeigneten Datumsdatentyp. – Strawberry

+0

Ich verwende Datetime, ist es nicht ein richtiger Datentyp? – user1493376

+0

Es ist, also ist alles in Ordnung dann – Strawberry

Antwort

0

Sieht aus wie diese mit MAX() Funktion gehandhabt werden können:

SELECT 
    quote.id , 
    quote.createdAt, 
    max(status.status) AS 'Status' 

FROM 
    quote 
     JOIN 
    quotelog ON quotelog.quote = quote.id 
     JOIN 
    status ON status.id = quotelog.status 
GROUP BY quote.id 

Da ‚q‘ größer ist dann ‚n‘ wird es Zitat wählen .. * zuerst.

Wenn für jede ID kann mehrere (mehr als 2) Status, darunter ein paar mit Zitat ... * dann müssen Sie die Logik angeben, die Sie auswählen möchten, und ich werde die Abfrage anpassen.

+0

Aussehen kann täuschen – Strawberry

+0

@ Strawberry DATES sind die gleichen, IDs sind die gleichen, nur Unterschied ist der Status. Ich sollte nicht aus Mangel an Informationen in der OP-Frage Downvote bekommen, und außerdem wissen Sie nicht einmal, ob das nicht das ist, was er braucht – sagi

+0

Sie haben diese Frage an anderer Stelle richtig beantwortet, so merkwürdig, dass Sie es hier falsch verstehen sollten. Das DV scheint mir fair. – Strawberry

0

Sie verwenden group by nicht für diesen Vorgang. Sie möchten eine ganze Zeile auswählen, Spalten innerhalb einer Zeile nicht zusammenfassen.

Der Ansatz verwendet eine Logik zum Auswählen der Zeile. Ich nehme an, dass created_at wirklich von quote_log und nicht quote kommt.

Hier ist eine Methode:

SELECT q.id, q.createdAt, s.status 
FROM quote q JOIN 
    quotelog ql 
    ON ql.quote = q.id JOIN 
    status s 
    ON s.id = ql.status 
WHERE ql.created_at = (SELECT MAX(ql2.created_at) 
         FROM quotelog ql2 
         WHERE ql2.id = ql.id 
        ); 
+0

zu erwähnen es gibt das gleiche Ergebnis zurück wie Beispieldaten, die ich in OP zur Verfügung gestellt habe, aber eine Unterabfrage ist nötig, also danke für die Idee – user1493376

0

Die beste Lösung, um den max (createdAt) von quotelog zu bekommen, ist eine Unterabfrage zu verwenden, um den max Datum zurückzubringen, und dann kommen Sie, dass Tabellen mit max Datum

SELECT quote.id 
    , quote.createdAt 
    , status.status 
    FROM quote 
INNER 
    JOIN (SELECT quote 
       , MAX(createdAt) AS latest 
      FROM quotelog 
     GROUP 
      BY quote) AS q 
    ON q.quote = quote.id 
INNER 
    JOIN quotelog 
    ON quotelog.quote = q.quote 
    AND quotelog.createdAt = q.latest 
INNER 
    JOIN status 
    ON status.id = quotelog.status 
Verwandte Themen