Ответ 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
)
Это структура таблицы
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
, и я не знаю, как это сделать. Может ли кто-нибудь указать мне правильное направление? спасибо заранее.
Это должно сделать это:
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
)
Вы хотите, чтобы он показывал последний 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.
В соответствии с этим: 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
Это очень старый вопрос, но я пришел сюда из-за той же проблемы, поэтому я оставляю это здесь, чтобы помочь другим.
Я пытался оптимизировать запрос, потому что запрос базы данных занимал более 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
Спасибо Пабло за комментарий. Вы спасли меня большое время!
Обходной путь, но рабочий раствор
Только если идентификатор имеет автоинкремент, вы можете искать максимальный идентификатор вместо максимальной даты. Итак, по идентификатору вы можете найти все остальные поля.
select *
from table
where id IN (
select max(id)
from table
group by #MY_FIELD#
)
Я использую это решение having max(date_entered)
, и оно работает очень хорошо
SELECT
report_id,
computer_id,
date_entered
FROM reports
GROUP BY computer_id having max(date_entered)
Идеально подходит для меня:
(SELECT content FROM tblopportunitycomments WHERE opportunityid = 1 ORDER BY dateadded DESC LIMIT 1);
Это прекрасно работает для меня
SELECT report_id,computer_id,MAX(date_entered) FROM reports GROUP BY computer_id
SELECT report_id, computer_id, date_entered
FROM reports
WHERE date_entered = (
SELECT date_entered
FROM reports
ORDER date_entered
DESC LIMIT 1
)
Сделал это на движке блога, чтобы получить последний блог. Я адаптировал его к структуре вашего стола.
SELECT * FROM reports WHERE date_entered = (SELECT max(date_entered) FROM REPORTS)