sql >> Database >  >> RDS >> Mysql

mysql - twee limieten nodig?

Je zult het moeten doen door een "rang" per district toe te passen, dan alleen grab per rang =1... De @LastDistrict op de join-locatie is standaard nul, in het geval dat het district is gebaseerd op een ID. Als district op tekens is gebaseerd, kunt u dit in plaats daarvan wijzigen in ="" om overeen te komen met het gegevenstype.

Om duidelijk te maken wat er aan de hand is. De pre-query "AwardCounts" doet de volledige zoekopdracht per district en lid met hoeveel onderscheidingen ook. Vervolgens gerangschikt op district en aantal leden (aflopend), waardoor het hoogste aantal onderscheidingen op de eerste positie per district komt te staan.

Dat is gekoppeld aan een andere nep-alias "SQLVars", die alleen inline-variabelen maakt voor de query genaamd @RankSeq en @LastDistrict. Dus, de eerste keer dat je binnenkomt, wordt de "DistRankSeq" een 1 voor het eerste district, en vul dan de "@LastDistrict" met de waarde van het district. De volgende inzending voor hetzelfde district (omdat het in de juiste volgorde staat) krijgt de rang 2, dan 3, enz... Wanneer er een verandering is van wat het "LAATSTE" district was naar het nieuwe record getest, wordt de rangorde teruggezet naar 1 en begint opnieuw. Dus je zou een district kunnen hebben met 100 leden, een ander met 5, een ander met 17...

Dus je laatste zoekopdracht heeft ze allemaal met hun respectievelijke rangen... Pas nu de HAVING the final district rank =1 toe... Door dit te doen, zou je ook kunnen aanpassen dat je de top 3 leden per district moet krijgen (bijvoorbeeld )...

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

BEWERK PER FEEDBACK Als het de aggregatie is die de tijd kost, dan zou ik het volgende doen. Maak een nieuwe tabel met niets anders dan de aggregaties per district, naam en initiële rangorde voor het district. Als een nieuw record aan deze tabel wordt toegevoegd, voegt de trigger er een toe aan het totaal aantal tabellen, controleert vervolgens waar die persoon zich in zijn district bevindt en werkt zijn nieuwe rangpositie opnieuw bij. Je zou nog een stap verder kunnen gaan en een andere tafel hebben met alleen "TOP"-leden per districtstabel, dat is één per district met de naam van de persoon. Wanneer een nieuwe persoon de hoogste positie bereikt, wordt zijn naam in de tabel gezet, waarbij degene die er het laatst was wordt overschreven.



  1. Wat zijn de voordelen van VistaDB

  2. Verbeter de prestaties van Galera Cluster voor MySQL of MariaDB

  3. sqlite geretourneerd:foutcode =1, msg =geen dergelijke kolom:keuken1

  4. Ruby on rails verbindingsprobleem