2017-06-05 7 views
1

Der Versuch, letzte Zeile jeden Tag auszuwählen.MySQL wählen letzte Zeile jeden Tag

Dies ist mein (vereinfacht, mehrere Datensätze in der tatsächlichen Tabelle) Tabelle:

+-----+-----------------------+------+ 
| id |  datetime  | temp | 
+-----+-----------------------+------+ 
| 9 | 2017-06-05 23:55:00 | 9.5 | 
| 8 | 2017-06-05 23:50:00 | 9.6 | 
| 7 | 2017-06-05 23:45:00 | 9.3 | 
| 6 | 2017-06-04 23:55:00 | 9.4 | 
| 5 | 2017-06-04 23:50:00 | 9.2 | 
| 4 | 2017-06-05 23:45:00 | 9.1 | 
| 3 | 2017-06-03 23:55:00 | 9.8 | 
| 2 | 2017-06-03 23:50:00 | 9.7 | 
| 1 | 2017-06-03 23:45:00 | 9.6 | 
+-----+-----------------------+------+ 

ich mit id auszuwählen Reihe wollen = 9, id = 6 und id = 3.

ich versucht habe, Diese Abfrage:

Aber Datum und Uhrzeit stimmt nicht überein.

Mit freundlichen Grüßen

+0

Können Sie bitte dies ausarbeiten: * Aber Datum und Uhrzeit stimmt nicht überein * –

Antwort

2

Hier ist eine Art und Weise, die das MAX Datum pro Tag erhält und verwendet sie dann in der INNER Abfrage die anderen Felder zu erhalten:

SELECT * 
FROM test 
WHERE `datetime` IN (
    SELECT MAX(`datetime`) 
    FROM test 
    GROUP BY DATE(`datetime`) 
); 

Hier ist die SQL Fiddle.

+0

Darshan Mehta: Perfekt! Ich wollte nur, dass ich wollte. O. Jones: ID wird automatisch inkrementiert und Zeilen werden nie aktualisiert. – droid

0

Wenn Ihre Zeilen werden immer eingesetzt und nie aktualisiert, und wenn id ist ein selbstinkrementierende Primärschlüssel, dann

SELECT w.* 
    FROM weatherdata w 
    JOIN ( SELECT MAX(id) id 
      FROM weatherdata 
      GROUP BY DATE(datetime) 
     ) last ON w.id = last.id 

erhalten Sie, was Sie wollen. Warum? Die innere Abfrage gibt den größten (dh neuesten) Wert id für jedes Datum in weatherdata zurück. Dies kann in der Tat sehr schnell sein, besonders wenn Sie einen Index auf die datetime Spalte setzen.

Aber es ist möglich, dass die Bedingungen dafür nicht funktionieren. Wenn Ihre datetime Spalte manchmal aktualisiert wird, um das Datum zu ändern, ist es möglich, dass größere id Werte nicht immer größere datetime Werte bedeuten.

In diesem Fall brauchen Sie so etwas.

Ihre Abfrage funktioniert nicht, weil sie die böse nicht standardmäßige Erweiterung für MySQL GROUP BY missbraucht. Lesen Sie dies: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Es sollte richtig the ANY_VALUE() function verwenden, um die Unvorhersehbarkeit der Ergebnisse hervorzuheben. Es shoud lesen ....

SELECT MAX(datetime) Stamp, ANY_VALUE(temp) temp 

das heißt, Sie sind nicht die richtige Zeile des Temperaturwert garantiert. Stattdessen kann der temporäre Wert aus jeder Zeile in der Gruppierung jedes Tages zurückgegeben werden.

+0

Danke für diesen Vorschlag. ID wird automatisch inkrementiert und Zeilen werden nie aktualisiert. Der Vorschlag von Darshan hat funktioniert, aber ich habe auch etwas von dir gelernt. Ich mag es, dass du erzählst, was die Abfrage macht. – droid

+0

Auch versuchte Ihren Vorschlag (der erste) und das funktioniert auch gut. Vielen Dank. – droid

Verwandte Themen