SQL - Gib mir nur 3 Treffer für jeden Typ

8

Ich habe eine Art unmögliche Anfrage :).

Ich habe eine Tabelle, in der eine der Spalten type heißt. Ich möchte 3 Datensätze für jeden Typ in dieser Spalte auswählen. Ist das möglich?

Beachten Sie auch, dass ich MySQL und Sphinx verwende.

UPDATE: Tabellenstruktur

%Vor%

Was ich von MySQL zurückgeben möchte, ist (bis zu 3 Datensätze für jeden nach Titel sortierten Typ):

%Vor%     
xpepermint 23.01.2011, 19:11
quelle

4 Antworten

12
%Vor%

(Verwendet einen anderen Artikel auf die gleiche Seite wie Martin Wickmans Antwort !)

    
Martin Smith 23.01.2011, 19:20
quelle
2

Wenn Sie einen Index für (type, title) haben und Sie die möglichen Werte für type kennen, glaube ich, dass dynamisches SQL (ausnahmsweise) die beste Leistung ist.

Fügen Sie für jeden möglichen Wert von type eine Union all und eine Auswahl für diesen bestimmten Typ hinzu. Die letzte Abfrage wird wie die folgende Abfrage aussehen:

%Vor%

Es wird in weniger als 1 Sekunde auf einer Tabelle mit 1.000.000 Zeilen ausgeführt, während die anderen Lösungen (Martins & amp; Cyberkiwis) ungefähr 11 Sekunden dauern.

Der Unterschied liegt darin, dass die obige unioned-Abfrage die ersten drei Titeleinträge für jeden Typ und dann stop abrufen kann, während die simulierte Analysefunktion die gesamte Tabelle scannen muss.

    
Ronnis 23.01.2011 21:03
quelle
2

Wenn die Tabelle groß und die Erfassung unberechenbarer ist, muss die Reihennummerierung nach Typ in der inneren Abfrage sortiert werden, damit die seiteneffektiven Variablen funktionieren.

%Vor%

Eine andere Möglichkeit, dies zu tun, ohne Nebeneffekte zu verwenden, wenn keine zwei Datensätze genau gleich sind (Titel, Typ, ID), ist unten angegeben. Dies verwendet nur Standard ANSI SQL92 SQL. Es kann jedoch langsamer als oben sein.

%Vor%     
RichardTheKiwi 23.01.2011 19:40
quelle
0

Sehen Sie sich an dieser Artikel. Gegeben:

%Vor%

Abfrage:

%Vor%     
Martin Wickman 23.01.2011 19:19
quelle