Вопрос

Пусть будет таблица, подобная этой :

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 - обычно первичный ключ, - то его следует использовать для соединений с вложенным запросом для повышения производительности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top