it-swarm.com.ru

Как выбрать МАКС (дата)?

Это структура таблицы

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

Мне нужен оператор SELECT, который будет перечислять report_id для computer_id из последнего введенного date_entered, и я понятия не имею, как это сделать. Кто-нибудь может указать мне правильное направление? Спасибо заранее.

19
poetter747

Это должно сделать это:

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

Вы хотите, чтобы он показывал последний введенный date_entered, или для заказа, начиная с введенной last_date?

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

В соответствии с этим: https://bugs.mysql.com/bug.php?id=54784 приведение к типу char должно помочь:

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

Обходной путь, но рабочий раствор

Только если идентификатор имеет автоинкремент, вы можете искать максимальный идентификатор вместо максимальной даты . Таким образом, по идентификатору вы можете найти все остальные поля.

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

Это очень старый вопрос, но я пришел сюда из-за той же проблемы, поэтому я оставляю это здесь, чтобы помочь другим.

Я пытался оптимизировать запрос, потому что запрос базы данных занимал более 5 минут из-за объема данных. Мой запрос был похож на принятый ответ. Комментарий Пабло подтолкнул меня в правильном направлении, и мой 5-минутный запрос стал 0,016 секунды. Поэтому, чтобы помочь другим пользователям, у которых очень длительное время запросов, попробуйте использовать некоррелированный подзапрос .

Примером для OP будет:

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

Спасибо Пабло за комментарий. Вы спасли меня большое время!

0
Jeremy