wake-up-neo.net

Wie kann man mit MAX (Datum) auswählen?

Dies ist die Tabellenstruktur

CREATE TABLE `reports` (
  `report_id` int(11) NOT NULL auto_increment,
  `computer_id` int(11) NOT NULL default '0',
  `date_entered` datetime NOT NULL default '1970-01-01 00:00:00',
  `total_seconds` int(11) NOT NULL default '0',
  `iphone_id` int(11) default '0',
  PRIMARY KEY  (`report_id`),
  KEY `computer_id` (`computer_id`),
  KEY `iphone_id` (`iphone_id`)
) ENGINE=MyISAM AUTO_INCREMENT=120990 DEFAULT CHARSET=latin1

Ich brauche eine SELECT-Anweisung, die den report_id pro computer_id aus dem zuletzt eingegebenen date_entered auflistet, und ich habe keine Ahnung, wie das geht. Kann mir jemand die richtige Richtung zeigen? Danke im Voraus.

19
poetter747

Das sollte es tun:

SELECT report_id, computer_id, date_entered
FROM reports AS a
WHERE date_entered = (
    SELECT MAX(date_entered)
    FROM reports AS b
    WHERE a.report_id = b.report_id
      AND a.computer_id = b.computer_id
)
38
bhamby

Soll nur das letzte Datum angezeigt werden oder mit dem letzten Datum bestellt werden?

SELECT report_id, computer_id, date_entered
FROM reports
GROUP BY computer_id
ORDER BY date_entered DESC
-- LIMIT 1 -- uncomment to only show the last date.
12
Genzume

Dementsprechend: https://bugs.mysql.com/bug.php?id=54784 casting als Char sollte den Trick tun:

SELECT report_id, computer_id, MAX(CAST(date_entered AS CHAR))
FROM reports
GROUP BY report_id, computer_id
3
Frane Poljak

Abhilfe aber funktionierende Lösung

Nur wenn die ID automatisch eininkrementiert, können Sie nach der maximalen ID anstelle des maximalen Datums suchen. So können Sie anhand der ID alle anderen Felder finden.

select *
from table
where id IN ( 
              select max(id)
              from table
              group by #MY_FIELD#
              )
0

Ich benutze diese Lösung und es funktioniert sehr gut

SELECT report_id, computer_id, date_entered FROM Berichte GROUP BY computer_id mit max (date_entered)

0
LuyRamone

Funktioniert perfekt für mich:

(SELECT content FROM tblopportunitycomments WHERE opportunityid = 1 ORDER BY dateadded DESC LIMIT 1);
0
xayer

Dies ist eine sehr alte Frage, aber ich bin wegen derselben Frage hierher gekommen, also lasse ich diese hier, um anderen zu helfen.

Ich habe versucht, die Abfrage zu optimieren, da die Abfrage der Datenbank aufgrund der Datenmenge über 5 Minuten dauerte. Meine Anfrage ähnelte der Anfrage der akzeptierten Antwort. Pablos Kommentar schob mich in die richtige Richtung und meine 5-Minuten-Abfrage betrug 0,016 Sekunden. Um allen anderen zu helfen, die sehr lange Abfragezeiten haben, versuchen Sie eine unkorrelierte Unterabfrage zu verwenden.

Das Beispiel für das OP wäre:

SELECT 
    a.report_id, 
    a.computer_id, 
    a.date_entered
FROM reports AS a
    JOIN (
        SELECT report_id, computer_id, MAX(date_entered) as max_date_entered
        FROM reports
        GROUP BY report_id, computer_id
    ) as b
WHERE a.report_id = b.report_id
    AND a.computer_id = b.computer_id
    AND a.date_entered = b.max_date_entered

Vielen Dank Pablo für den Kommentar. Sie haben mir viel Zeit gespart!

0
Jeremy