Подтвердить что ты не робот

Как выбрать MAX (дата)?

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

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, и я не знаю, как это сделать. Может ли кто-нибудь указать мне правильное направление? спасибо заранее.

4b9b3361

Ответ 1

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

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
)

Ответ 2

Вы хотите, чтобы он показывал последний 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.

Ответ 3

В соответствии с этим: 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

Ответ 4

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

Я пытался оптимизировать запрос, потому что запрос базы данных занимал более 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

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

Ответ 5

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

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

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

Ответ 6

Я использую это решение having max(date_entered), и оно работает очень хорошо

SELECT 
  report_id, 
  computer_id, 
  date_entered
FROM reports
GROUP BY computer_id having max(date_entered)

Ответ 7

Идеально подходит для меня:

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

Ответ 8

Это прекрасно работает для меня

SELECT report_id,computer_id,MAX(date_entered) FROM reports GROUP BY computer_id

Ответ 9

SELECT report_id, computer_id, date_entered
FROM reports
WHERE date_entered = (
    SELECT date_entered 
    FROM reports 
    ORDER date_entered 
    DESC LIMIT 1
)

Ответ 10

Сделал это на движке блога, чтобы получить последний блог. Я адаптировал его к структуре вашего стола.

SELECT * FROM reports WHERE date_entered = (SELECT max(date_entered) FROM REPORTS)