MySQL - сервер :выбор X наименьших значений
-
13-09-2019 - |
Вопрос
Пусть будет таблица, подобная этой :
CREATE TABLE `amoreAgentTST01` (
`moname` char(64) NOT NULL DEFAULT '',
`updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`data` longblob,
PRIMARY KEY (`moname`,`updatetime`)
У меня есть запрос, чтобы найти самые старые записи для каждого отдельного 'moname', но только если для этого 'moname' существует несколько записей :
SELECT moname, updatetime FROM amoreAgentTST01 a
WHERE (SELECT count(*) FROM amoreAgentTST01 x WHERE x.moname = a.moname) > 1
AND a.updatetime = (SELECT min(updatetime) FROM amoreAgentTST01 y WHERE y.moname = a.moname) ;
Мой вопрос заключается в следующем :как сделать то же самое, но выбрав X самых старых значений?Теперь я просто запускаю это, удаляю самые старые значения и запускаю повторно...что не так уж и приятно.
Второй вопрос заключается в :что вы думаете о приведенном выше запросе ?можно ли это улучшить ?есть ли какая - нибудь очевидная плохая практика ?
Заранее благодарю вас за ваши советы и помощь.
Барт
Решение
Сработает ли что-то подобное этому (непроверенное):
SELECT moname, MIN(updatetime) FROM amoreAgentTST01
GROUP BY moname HAVING COUNT(moname)>1
Редактировать - приведенное выше предназначено только для замены вашего существующего кода, поэтому оно не дает прямого ответа на ваш вопрос.
Я думаю, что что-то подобное должно сработать для вашего главного вопроса:
SELECT moname, updatetime FROM amoreAgentTST01
GROUP BY moname, updatetime
HAVING COUNT(moname)>1
ORDER BY updatetime LIMIT 0, 10
Редактировать - извините, вышеприведенное не сработает, потому что оно возвращает только 10 записей для всех мононимов, а не 10 самых старых для каждого.Дай мне подумать.
Еще один подход к этому (по общему признанию, этот выглядит немного запутанным):
SELECT a.moname, a.updatetime FROM amoreAgentTST01 a
WHERE EXISTS
(SELECT * FROM amoreAgentTST01 b
WHERE a.moname = b.moname AND a.updatetime = b.updatetime
ORDER BY b.updatetime LIMIT 0, 10)
AND (SELECT COUNT(*) FROM amoreAgentTST01 x WHERE x.moname = a.moname) > 1
Я должен добавить, что если есть столбец ID - обычно первичный ключ, - то его следует использовать для соединений с вложенным запросом для повышения производительности.