2009-04-23 7 views
0

Let eine Tabelle wie folgt sein:MySQL: Auswahl der X kleinsten Werte

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

Ich habe eine Abfrage, die ältesten Datensätze für jede einzelne ‚moname‘ zu finden, aber nur wenn es mehrere Datensätze für diese ' 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) ; 

Meine Frage ist: Wie man das selbe tut, aber die X ältesten Werte auswählend? Ich führe das jetzt einfach aus, lösche die ältesten Werte und führe es erneut aus ... was nicht so schön ist.

Sekunden Frage ist: Was halten Sie von der obigen Abfrage? Kann es verbessert werden? Gibt es irgendeine offensichtliche schlechte Praxis?

Vielen Dank im Voraus für Ihre Ratschläge und Hilfe.

Barth

+0

Möchten Sie alle Zeilen auswählen, die nicht die neueste Zeile für dieses Moname sind? Oder nur eine konstante X Zeilen pro Moname? – NickZoic

+0

Eine Konstante X Zeilen pro Moname, wobei diese Zeilen die ältesten sind. – Barth

Antwort

3

wäre so etwas wie dieses Werk (ungetestet):

SELECT moname, MIN(updatetime) FROM amoreAgentTST01 
GROUP BY moname HAVING COUNT(moname)>1 

Bearbeiten - das oben nur als Ersatz für Ihren bestehenden Code gemeint ist, so dass es nicht direkt Ihre Frage beantworten.

Ich denke, so etwas wie dies sollte für Ihre Hauptfrage arbeiten:

SELECT moname, updatetime FROM amoreAgentTST01 
GROUP BY moname, updatetime 
HAVING COUNT(moname)>1 
ORDER BY updatetime LIMIT 0, 10 

Bearbeiten - sorry, die oben nicht funktionieren, weil es nur 10 Datensätze für alle monames Rückkehr - eher als die 10 ältesten für jeder. Lass mich nachdenken.

Ein weiterer Sprung in diese (zugegebenermaßen, das sieht man ein wenig verworren):

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 

Ich sollte hinzufügen, dass, wenn es eine ID-Spalte - in der Regel die primäre Schlüssel- für die das sollte dann verwendet werden, Unterabfrage-Joins für verbesserte Leistung.

+0

In der Tat ist das viel besser als die Abfrage, die ich zuvor hatte. Vielen Dank ! – Barth

+0

Ich habe gerade meine Antwort mit einer möglichen Lösung aktualisiert. – BrynJ

Verwandte Themen