MySQL: выбор X самых маленьких значений - PullRequest
0 голосов
/ 23 апреля 2009

Позвольте быть таблицей, как это:

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`)

У меня есть запрос, чтобы найти самые старые записи для каждой отдельной «монамы», но только если для этой «монамы» существует несколько записей:

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 самых старых значений? Теперь я просто запускаю это, удаляю самые старые значения и перезапускаю ... что не так приятно.

Вопрос в секундах: что вы думаете о вышеупомянутом запросе? это может быть улучшено? есть ли очевидная плохая практика?

Заранее благодарим вас за советы и помощь.

Barth

1 Ответ

3 голосов
/ 23 апреля 2009

Хотелось бы что-нибудь подобное (не проверено):

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

Я должен добавить, что если есть столбец идентификатора (обычно это первичный ключ), то его следует использовать для объединений подзапросов для повышения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...