2016-07-14 11 views
2

Ich muss die letzten 2 Ergebnisse aus einer Tabelle (Ergebnisse) anzeigen, die Ergebnisse bestehen aus mehreren Zeilen mit passender submissionId, Die Anzahl der Zeilen pro Einreichung ist unbekannt, und natürlich ich bevorzuge eine einzelne Abfrage. HierMySQL Gruppe mehrere Zeilen basierend auf DISTINCT Wert

ist der DB-Tabellenstruktur

submissionId  input  value 

    1   name   jay 
    1   phone  123-4567 
    1   email  [email protected] 
    2   name   mo 
    2   age   32 
    3   name   abe 
    3   email  [email protected] 
    4   name   jack 
    4   phone  123-4567 
    4   email  [email protected] 

Desierd Ergebnisse:

submissionId  input  value 

    3   name   abe 
    3   email  [email protected] 
    4   name   jack 
    4   phone  123-4567 
    4   email  [email protected] 

Oder noch besser, wenn ich die Zeilen wie folgt zu kombinieren:

3   name   abe 3  email  [email protected] 
4   name   jack 4  phone  123-4567   4   email  [email protected] 
+0

Und mit den "letzten beiden Ergebnissen" meinen Sie diejenigen mit den größten und zweitgrößten distinkten "submissionId" -Werten? –

+0

@vkp Ich habe versucht, dies: SELECT DISTINCT t1.submissionId FROM Ergebnisse t1 LEFT JOIN Ergebnisse t2 ON t1.submissionId = t2.submissionId GROUP BY t1.submissionId –

+0

@JohnBollinger Ja (bis jetzt) ​​Später plane ich um eine Datumsspalte hinzuzufügen und die 2 neuesten Ergebnisse zu erhalten –

Antwort

2

Sie limit in Subqueries in der from Klausel verwenden können, so eine typische Art und Weise, dies zu schreiben ist:

SELECT submissionDate, input, value 
FROM t join 
    (select distinct submissionDate 
     from t 
     order by submissionDate desc 
     limit 2 
    ) sd 
    on t.submissionDate = sd.submissionDate; 
+0

Danke, mit ein wenig Modifikation funktionierte das wie gewünscht. –

+0

Ich werde versuchen, mich daran zu erinnern, wenn ich das nächste Mal eine ähnliche Frage sehe. –

2

Eine Möglichkeit hier Verwenden Sie eine Unterabfrage, um das neueste und das neueste submissionId zu identifizieren:

SELECT submissionId, input, value 
FROM yourTable 
WHERE submissionId >= (SELECT MAX(submissionId) FROM yourTable) - 1 
ORDER BY submissionId 

Demo hier:

SQLFiddle

Update:

Wenn Ihre submissionId Spalte wirklich ein Datum Art war, und Sie wollten die letzten zwei Tage, in Ihrem Ergebnis gesetzt, dann wird die folgende Abfrage das erreichen. Beachten Sie, dass die Unterabfrage in der WHERE-Klausel zwar hässlich ist, aber nicht mit der äußeren Abfrage korreliert ist. Das bedeutet, dass der MySQL-Optimierer herausfinden sollte, dass er ihn nur einmal ausführen muss.

SELECT submissionDate, input, value 
FROM yourTable 
WHERE submissionDate >= 
    (SELECT MAX(CASE WHEN submissionDate = (SELECT MAX(submissionDate) FROM yourTable) 
        THEN '1000-01-01' 
        ELSE submissionDate 
       END) FROM yourTable) 
ORDER BY submissionDate 

SQLFiddle

+0

Diesen Fehler zurückbekommen: Diese Version von MySQL unterstützt noch nicht 'LIMIT & IN/ALL/ANY/EINIGE Unterabfrage' –

+0

@MoisheySchwartz Ich habe meine Antwort aktualisiert. –

+0

Ihre neue Abfrage geht davon aus, dass die submitId-Nummern keine Lücken aufweisen. Es ist unklar, ob das eine sichere Annahme ist. In jedem Fall wird dieser Ansatz nicht funktionieren, wenn das OP in eine zeitstempelbasierte Definition von "letzten zwei" umwandelt, wie er jetzt in Kommentaren sagt, die er letztlich tun will. –

0

Dies ist, wie die Abfrage jetzt aussieht, so i kann die Ergebnisse mit einem LIMIT, RANGE und ID/Timestamp bekommen (mit Hilfe von Tim und Gordon):

SELECT * 
FROM rmyTable t 
JOIN 
(SELECT DISTINCT sd.submissionId 
FROM myTable sd 
WHERE sd.questionId = yourId 
ORDER BY sd.submissionId 
LIMIT 2 
) t2 
ON t.submissionId = t2.submissionId 
WHERE t.formId = yourId 
AND dateTime BETWEEN 0000 AND 1111 
Verwandte Themen