0

このようなテーブルにしましょう:

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個の最も古い値を選択しますか?これを実行し、最も古い値を削除して再実行するだけです...これはあまり良くありません。

2番目の質問は:上記のクエリについてどう思いますか?改善できますか?明らかな悪い習慣はありますか?

よろしくお願いします。

バース

4

1 に答える 1

3

この作品のようなものはありますか(テストされていません):

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

編集-申し訳ありませんが、上記はすべてのmonamesに対して10レコードしか返さないため、機能しません-それぞれについて最も古い10レコードではありません。考えさせてください。

もう1つこれを試してみてください(確かに、これは少し複雑に見えます):

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列(通常は主キー)がある場合は、パフォーマンスを向上させるために、それをサブクエリ結合に使用する必要があることを追加する必要があります。

于 2009-04-23T09:58:46.820 に答える