Ceci est la structure de la table
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
J'ai besoin d'une instruction SELECT
qui listera le report_id
par computer_id
à partir du dernier date_entered
entré, et je ne sais pas comment faire. Quelqu'un peut-il me diriger dans la bonne direction? Merci d'avance.
Cela devrait le faire:
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
)
Voulez-vous seulement qu'il affiche la dernière date_entrée ou que vous commenciez par la dernière date entrée?
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.
Selon ce qui suit: https://bugs.mysql.com/bug.php?id=54784 le casting comme caractère devrait faire l'affaire:
SELECT report_id, computer_id, MAX(CAST(date_entered AS CHAR))
FROM reports
GROUP BY report_id, computer_id
Solution de contournement mais solution de travail
Ce n'est que si ID est incrémenté automatiquement que vous pouvez rechercher l'ID maximum au lieu de la date maximum . Ainsi, l'ID vous permet de trouver tous les autres champs.
select *
from table
where id IN (
select max(id)
from table
group by #MY_FIELD#
)
C'est une très vieille question mais je suis venu ici à cause du même problème, alors je laisse ça ici pour aider les autres.
J'essayais d'optimiser la requête car l'interrogation de la base de données prenait plus de 5 minutes en raison de la quantité de données. Ma requête était similaire à celle de la réponse acceptée. Le commentaire de Pablo m'a poussé dans la bonne direction et ma requête de 5 minutes est devenue 0,016 seconde. Donc, pour aider ceux qui ont des temps de requête très longs, essayez d’utiliser une sous-requête non corrélée .
L’exemple pour le PO serait:
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
Merci Pablo pour le commentaire. Tu m'as sauvé beaucoup de temps!