Как выбрать по макс (дата)? - PullRequest
22 голосов
/ 20 октября 2011

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

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

Ответы [ 9 ]

42 голосов
/ 20 октября 2011

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

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
)
13 голосов
/ 20 октября 2011

Вы хотите, чтобы он показывал только последний введенный date или заказ, начиная с введенной 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 голосов
/ 26 октября 2015

В соответствии с этим: 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
0 голосов
/ 06 июня 2019

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

SELECT * FROM reports WHERE date_entered = (SELECT max(date_entered) FROM REPORTS)
0 голосов
/ 14 мая 2019

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

(SELECT content FROM tblopportunitycomments WHERE opportunityid = 1 ORDER BY dateadded DESC LIMIT 1);
0 голосов
/ 10 мая 2019

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

SELECT report_id, computer_id, date_entered ИЗ отчетов GROUP BY computer_id с максимальным (date_entered)

0 голосов
/ 07 февраля 2019

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

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

select *
from table
where id IN ( 
              select max(id)
              from table
              group by #MY_FIELD#
              )
0 голосов
/ 24 августа 2018

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

Я пытался оптимизировать запрос, потому что запрос базы данных занимал более 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 голосов
/ 15 декабря 2017
SELECT report_id, computer_id, date_entered
FROM reports
WHERE date_entered = (
    SELECT date_entered 
    FROM reports 
    ORDER date_entered 
    DESC LIMIT 1
)
...