web-dev-qa-db-fra.com

Comment sélectionner par MAX (date)?

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.

19
poetter747

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
)
38
bhamby

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.
12
Genzume

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
3
Frane Poljak

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#
              )
0
Gianluca Demarinis

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!

0
Jeremy