Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql - braucht man zwei Limits?

Sie müssen dies tun, indem Sie einen "Rang" pro Distrikt anwenden und dann nur pro Rang greifen =1 ... Der @LastDistrict am Beitrittsort ist standardmäßig auf Null gesetzt, falls der Distrikt auf einer ID basiert. Wenn der Bezirk zeichenbasiert ist, können Sie ihn einfach in ="" ändern, um ihn an den Datentyp anzupassen.

Um zu klären, was passiert. Die Vorabfrage "AwardCounts" führt die gesamte Abfrage pro Distrikt und Mitglied mit beliebig vielen Award-Zählungen durch. Dann geordnet nach Distrikt und Anzahl der Mitgliederauszeichnungen (absteigend), wodurch die höchste Anzahl an Auszeichnungen an erster Stelle pro Distrikt steht.

Das ist mit einem anderen falschen Alias ​​"SQLVars" verbunden, der nur Inline-Variablen für die Abfrage namens @RankSeq und @LastDistrict erstellt. Beim ersten Mal wird „DistRankSeq“ also zu einer 1 für den ersten Bezirk, dann wird „@LastDistrict“ mit dem Wert des Bezirks geprimt. Dem nächsten Eintrag für denselben Distrikt (da er in der richtigen Reihenfolge ist) wird der Rang 2, dann 3 usw. zugewiesen. Wenn es eine Änderung vom „LETZTEN“ Distrikt zum neuen Datensatz gibt getestet, wird der Rang auf 1 zurückgesetzt und beginnt von vorne. Sie könnten also einen Distrikt mit 100 Mitgliedern haben, einen anderen mit 5, einen anderen mit 17...

Ihre letzte Abfrage enthält also alle mit ihren jeweiligen Rängen ... Wenden Sie nun an, dass der endgültige Distriktrang =1 ist ... Auf diese Weise können Sie auch die Notwendigkeit anpassen, die besten 3 Mitglieder pro Distrikt zu erhalten (z )...

select
      AwardCounts.District,
      AwardCounts.MemberName,
      AwardCounts.memberAwards,
      @RankSeq := if( @LastDistrict = AwardCounts.District, @RankSeq +1, 1 ) DistRankSeq,
      @LastDistrict := AwardCounts.District as ignoreIt
   from
      ( select 
              a.district,
              a.membername,
              count(*) as memberAwards
           from
              Awards a
           group by
              a.district,
              a.membername
           order by
              a.district,
              memberAwards desc ) AwardCounts

      JOIN (select @RankSeq := 0, @LastDistrict = 0 ) SQLVars
   HAVING
      DistRankSeq = 1

BEARBEITEN PRO FEEDBACK Wenn es die Aggregation ist, die die Zeit in Anspruch nimmt, würde ich Folgendes tun. Erstellen Sie eine neue Tabelle mit nichts als den Aggregationen pro Distrikt, Name und Anfangsrang für den Distrikt. Wenn dieser Tabelle ein neuer Datensatz hinzugefügt wird, fügt der Trigger der Gesamttabellenzahl eins hinzu, prüft dann, wo sich diese Person in ihrem Distrikt befindet, und aktualisiert ihre neue Rangposition erneut. Sie könnten noch einen Schritt weiter gehen und eine weitere Tabelle mit nur „TOP“-Mitgliedern pro Distrikt haben, die eine pro Distrikt mit dem Namen der Person ist. Wenn eine neue Person die oberste Position erreicht, wird ihr Name in die Tabelle eingetragen und überschreibt denjenigen, der zuletzt dort war.