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.
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
)
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.
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
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#
)
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)
Funktioniert perfekt für mich:
(SELECT content FROM tblopportunitycomments WHERE opportunityid = 1 ORDER BY dateadded DESC LIMIT 1);
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!