MySQL-Abfrage, MAX () + GROUP BY
Daft SQL Frage. Ich habe eine Tabelle etwa so ('pid' ist auto-increment primary col)
CREATE TABLE theTable (
`pid` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
`timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`cost` INT UNSIGNED NOT NULL,
`rid` INT NOT NULL,
) Engine=InnoDB;
Eigentlichen Tabellendaten:
INSERT INTO theTable (`pid`, `timestamp`, `cost`, `rid`)
VALUES
(1, '2011-04-14 01:05:07', 1122, 1),
(2, '2011-04-14 00:05:07', 2233, 1),
(3, '2011-04-14 01:05:41', 4455, 2),
(4, '2011-04-14 01:01:11', 5566, 2),
(5, '2011-04-14 01:06:06', 345, 1),
(6, '2011-04-13 22:06:06', 543, 2),
(7, '2011-04-14 01:14:14', 5435, 3),
(8, '2011-04-14 01:10:13', 6767, 3)
;
Möchte ich, um die PID der aktuellen Zeile für jedes Los (1 Folge pro unique RID). Für die Beispieldaten, die ich möchte:
pid | MAX(timestamp) | rid
-----------------------------------
5 | 2011-04-14 01:06:06 | 1
3 | 2011-04-14 01:05:41 | 2
7 | 2011-04-14 01:14:14 | 3
Ich habe versucht die folgende Abfrage ausführen:
SELECT MAX(timestamp),rid,pid FROM theTable GROUP BY rid
und ich bekomme:
max(timestamp) ; rid; pid
----------------------------
2011-04-14 01:06:06; 1 ; 1
2011-04-14 01:05:41; 2 ; 3
2011-04-14 01:14:14; 3 ; 7
Den PID zurückgegeben wird, ist immer das erste auftauchen der PID für eine RID (Zeile /pid 1 ist frst Zeit Los 1 verwendet wird, Zeilen - /pid 3 in der ersten RID-2 verwendet wird, Zeilen - /pid-7 ist die erste Zeit entfernen 3 verwendet wird). Obwohl die Rückgabe der max timestamp für jedes Los, die pids sind nicht die pids für den Zeitstempel aus der ursprünglichen Tabelle. Wie Sie die Abfrage würde mir die Ergebnisse, die ich Suche?
InformationsquelleAutor der Frage codinghands | 2011-04-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Getestet in PostgreSQL 9.etwas)
Identifizieren, die die rid-und Zeitstempel.
Beitreten.
InformationsquelleAutor der Antwort Mike Sherrill 'Cat Recall'
Hoffe, dass ich geholfen !
InformationsquelleAutor der Antwort anzize
InformationsquelleAutor der Antwort dkretz
Ich erstellt einen index auf rid und timestamp.
Showing rows 0 - 2 (3 insgesamt, die Abfrage dauerte 0.0104 s)
Diese Methode wählen Sie die gewünschten Werte aus
theTable
(test), linke-Beitritt selbst (maxt) auf alle Zeitstempel höher ist als die im test mit dem gleichen Los zu werden. Wenn der Zeitstempel ist schon der höchste im test, es gibt keine Spiele auf maxt - das ist, was wir suchen - Werte maxt werden NULL. Jetzt verwenden wir die WHERE-Klauselmaxt.rid IS NULL
oder einer anderen Spalte auf maxt.InformationsquelleAutor der Antwort Caio Iglesias
Hätte man auch Unterabfragen wie:
Aber auf diese Weise, müssen Sie eine weitere Unterabfrage, wenn Sie wollen
cost
enthalten in den angezeigten Spalten, usw.So, die
group by
undjoin
ist die bessere Lösung.InformationsquelleAutor der Antwort ypercubeᵀᴹ
Wenn Sie vermeiden möchten, eine VERKNÜPFUNG, die Sie verwenden können:
InformationsquelleAutor der Antwort Nicolás Previale
Versuchen:
InformationsquelleAutor der Antwort vy32