mysql limit innerhalb der Gruppe?
Ich will zur Begrenzung der Größe der Datensätze innerhalb einer Gruppe, und hier ist mein Versuch, wie man es richtig macht?
mysql> select * from accounts limit 5 group by type;
ERROR 1064 (42000): Sie haben einen Fehler in Ihrer SQL-syntax; check the manual
das entspricht Ihrer MySQL-server-version für die
richtigen syntax in der Nähe 'group by type" in Zeile 1
Ich denke, dass das, was Sie wollen, ist ein
ja,wie zu erreichen?
Nur Durch Die Art und Weise, Sie setzen die Grenze, an der das 'Ende' der Abfrage.
Dieser thread ist 6 Jahre alt, aber wenn Sie fanden diese bei Google check-out Adam Prescott Antwort unten. Es ist schnell und das Verfahren ist erweiterbar, um andere schwerer Aggregate, wie z.B. median-Aggregat.
order
, nicht ein group
. Sie möchten die Liste bis zu 5 von jedem account-Typ, richtig?ja,wie zu erreichen?
Nur Durch Die Art und Weise, Sie setzen die Grenze, an der das 'Ende' der Abfrage.
Dieser thread ist 6 Jahre alt, aber wenn Sie fanden diese bei Google check-out Adam Prescott Antwort unten. Es ist schnell und das Verfahren ist erweiterbar, um andere schwerer Aggregate, wie z.B. median-Aggregat.
InformationsquelleAutor omg | 2009-07-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Punkt einer Aggregatfunktion (und die GRUPPE VON ihm verlangt) ist, schalten Sie viele Zeilen in eine Zeile. Also, wenn Sie wirklich wollen einfach nur die top-5 Sparkonten die top 5 chequing-Konten und die top-5-USD-Konten usw., was Sie brauchen, ist mehr so:
Kriterien: top-5-Besondere Konto-Typ account_balance
Es ist nicht schön, aber wenn Sie erstellen die SQL-Skript dann subbing in der account_types und verketten eine Abfrage ist unkompliziert.
InformationsquelleAutor dnagirl
Ich hatte etwas Glück mit nummerierten Zeilen:
Diese wird Ihnen 2 Ergebnisse pro
item_type
. (Eine gotcha: stellen Sie sicher, dass Sie re-run der ersten beidenset
Aussagen sonst die Zeilen-Nummern werden stetig höher und höher und dierow_number < 3
Beschränkung wird nicht funktionieren.Ich lötete diese zusammen aus ein paar Beiträge, die wurden mit der in andere Antworten.
from items, (SELECT @type:='', @num:=0) v
und dann können Sie die Variablen innerhalb der join, statt in einer separaten Anweisung. Das kann hilfreich sein in Umgebungen, die nicht erlauben, dass mehrere Aussagen.InformationsquelleAutor Adam Prescott
Es scheint, dass Sie möchten, um die Anzahl der zurückgegebenen Zeilen innerhalb jeder Gruppe Ihre gesamte ResultSet... das ist schwer zu tun, in einer Weise, die skaliert gut. Eine Technik ist die Durchführung von N-joins auf die gleiche Tabelle, die Bedingungen so, dass die nur die Zeilen, die übereinstimmen, sind die top/bottom N, die Sie möchten.
auf dieser Seite können bieten einige zusätzliche Einblicke in Ihre Lösung... obwohl die Rückgabe der top 5 in jeder Gruppe wird schnell hässlich.
InformationsquelleAutor Ty W
Versuchen, indem Sie die LIMIT-Klausel nach der Klausel GROUP BY.
BEARBEITEN: Versuchen Sie dies:
Dieser liefert bis zu 5 Konten der jeweiligen Art mit dem größten Guthaben.
InformationsquelleAutor Ken Keenan
Group by verwendet für Aggregat-Funktionen (Summen, Durchschnitte...)
Ist können Sie split das aggregierte Ergebnis in Gruppen. Sie nicht verwendet haben, eine dieser Funktionen.
InformationsquelleAutor John Barrett
Ich bin nicht sicher, Sie können ein limit in der Gruppe durch. Wahrscheinlich können Sie es verwenden, wenn Ihre Gruppe ist ein sub-select, gibt eine Zeile/Wert. Zum Beispiel:
select * from foo order by (select foo2.id von foo2 limit 1)
Bin ich nur vermute, dass dies funktionieren würde.
InformationsquelleAutor northpole
Dieser wird wahrscheinlich den trick tun, obwohl, wenn
type
ist nicht indiziert, es werden sloooowwww. Und auch mit einer, es ist nicht besonders schnell:Eine bessere Wette wäre, nur
order
die Liste vontype
und dann eine Schleife verwenden, in der business-Schicht um die Zeilen zu entfernen, die Sie nicht wollen.InformationsquelleAutor Plutor
@dnagirl Antwort fast hat es, aber aus irgendeinem Grund, meine version von MySQL gibt nur die erste GRENZE würden eingestellt. Das zu umgehen, lege ich jede Anweisung in einer Unterabfrage
Dieser gab mir wieder jeder Satz, der die Ergebnisse in das endgültige Ergebnis eingestellt. Ansonsten würde ich nur dazu gekommen die ersten 5 aus der ersten Abfrage und nichts anderes - nicht sicher, ob es nur einige einige MySQL-funk mit meiner version
InformationsquelleAutor phatskat