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%(Verwendet einen anderen Artikel auf die gleiche Seite wie Martin Wickmans Antwort !)
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:
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.
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%Sehen Sie sich an dieser Artikel. Gegeben:
%Vor%Abfrage:
%Vor%Tags und Links sql mysql sphinx greatest-n-per-group