2016-08-02 3 views
1

Ich habe eine Tabelle, die die Antworten auf eine Frage enthält, die beim Eintritt in das System, in Überprüfungszeiträume und dann bei Schließung gestellt wird. Der Client kann mehrmals während seiner Lebensdauer auf dem System geöffnet und geschlossen werden.Geben Sie das letzte Eintragsergebnis zurück, wenn es eine Überprüfung oder eine enge Eingabe gibt

Ich versuche, das neueste 'Entry' -Ergebnis aus der Tabelle zu erhalten, die auch entweder ein 'Review' oder 'Close' Ergebnis hat.

Das ist mein Tisch ist (ich habe enthalten nur 1 Benutzer aber die tatsächliche Tabelle hat Tausende von Benutzern):

row | user_id | answer | type | date_entered | 
----+---------+--------+--------+--------------+ 
1 | 12 | 3 | entry | 2016-03-13 | 
2 | 12 | 1 | review | 2016-03-14 | 
3 | 12 | 7 | review | 2016-03-16 | 
4 | 12 | 7 | close | 2016-03-17 | 
5 | 12 | 8 | entry | 2016-03-20 | 
6 | 12 | 2 | review | 2016-03-21 | 
7 | 12 | 3 | close | 2016-03-22 | 
8 | 12 | 1 | entry | 2016-03-28 | 

Also für diese Tabelle der Abfrage auf Zeile nur Zeile 5, weil der ‚Eintrag‘ zurückkehren 8 hat keine "Review" - oder "Closure" -Rekorde danach.

Hoffentlich macht das Sinn.

+0

Die Antwort wirklich etwas damit zu tun hat nicht, lege ich das nur als ein in Beispielspalte, die die Antwort auf die Frage enthält, tut mir leid, wenn das Dinge verwirrt hat. Es hat alles mit der Spalte type zu tun, wenn in der Spalte type keine Datensätze vorhanden sind, die überprüft oder geschlossen wurden, nachdem ein Datensatz mit einem Eintrag in der Spalte type nicht enthalten ist. Es muss ein Datensatz vorhanden sein, der in der Spalte "Typ" nach (nach Datum) den Eintragsdatensatz für die Zählung überprüft oder geschlossen hat. – Sean

+0

Wie können Sie feststellen, dass Zeilen 6 und 7 sich auf Zeile 5 beziehen? – Strawberry

+0

Sie sind alle verwandt, weil sie alle für denselben Benutzer sind. – Sean

Antwort

1
SELECT a.* 
    FROM my_table a 
    JOIN 
    (SELECT x.user_id 
      , MAX(x.date_entered) date_entered 
     FROM my_table x 
     JOIN my_table y 
      ON y.user_id = x.user_id 
      AND y.date_entered > x.date_entered 
      AND y.type IN ('review','close') 
     WHERE x.type = 'entry' 
     GROUP 
      BY x.user_id 
    ) b 
    ON b.user_id = a.user_id 
    AND b.date_entered = a.date_entered; 
+0

Ausgezeichnet, vielen Dank! – Sean

0

Grundsätzlich können Sie Ihre Abfrage in zwei Unterabfragen trennen. Die erste Abfrage sollte die letzte Datensatz-ID erhalten (Überprüfung und Schließung). Zweite Abfrage sollte row_id > found_id haben.

SELECT * 
FROM my_table 
WHERE type = 'entry' 
     AND row_id > (SELECT Max(row_id) 
        FROM my_table 
        WHERE (type = 'review' 
           OR type = 'close')) 

Bitte seien Sie vorsichtig darüber; Unterabfrage kann Nullmenge zurückgeben.

0

Ich denke, könnte von mehreren Möglichkeiten, es zu tun. Aber zuerst eine Anmerkung: Ihr date_entered Feld scheint nur ein Datum zu sein. Um zu sagen, welche "später" auftritt, werde ich row verwenden, weil z.B. Wenn sowohl entry als auch review am selben Datum aufgetreten sind, ist es nicht möglich, aus dem date_entered zu unterscheiden, welches später gefunden wurde.

Ich liste nur ein paar Lösungen auf. Der erste könnte effizienter sein, aber Sie sollten messen.

Hier ist ein gegen eine Unterabfrage beitreten:

SELECT 
    m1.* 
FROM 
    mytable m1 
    JOIN (SELECT 
       row, user_id 
      FROM 
       mytable 
      WHERE 
       type IN ('review', 'close') AND 
       user_id = 12 
      ORDER BY row DESC LIMIT 1) m2 ON m1.user_id = m2.user_id 
WHERE 
    m1.user_id = 12 AND 
    m1.row < m2.row 
ORDER BY 
    row DESC LIMIT 1 

Hier ist eine Unterabfrage für max:

SELECT 
    * 
FROM 
    mytable 
WHERE 
    row = (SELECT 
       MAX(m1.row) 
      FROM 
       mytable m1, 
       mytable m2 
      WHERE 
       m1.user_id = m2.user_id AND 
       m1.type = 'entry' AND 
       m2.type IN ('review', 'close') AND 
       m1.row < MAX(m2.row)) 
Verwandte Themen