sql >> Databáze >  >> RDS >> Mysql

mysql - potřebujete dva limity?

Budete to muset udělat tak, že použijete "hodnost" na okres, pak pouze uchopte za pořadí =1... @Poslední okres v místě připojení je výchozí nula, v případě, že je okres založen na ID. Pokud je okres založen na znacích, můžete jej změnit na ="" místo toho, aby odpovídal datovému typu.

Abychom objasnili, co se děje. Předběžný dotaz "AwardCounts" provede celý dotaz na okres a člena s libovolným počtem ocenění. Poté seřazeno podle okresu a počtu ocenění členů (sestupně), čímž se nejvyšší počet ocenění umístí na první pozici za okres.

To je spojeno s dalším falešným aliasem „SQLVars“, který pouze vytváří vložené proměnné pro dotaz s názvem @RankSeq a @LastDistrict. Takže poprvé v, "DistRankSeq" se stane 1 pro první okres, pak přičte "@LastDistrict" hodnotou okresu. Dalšímu záznamu pro stejný okres (protože bude ve správném pořadí) bude přidělena hodnost 2, pak 3, atd... Když dojde ke změně z jakéhokoli „POSLEDNÍHO“ okresu na nový záznam. testováno, pořadí se nastaví zpět na 1 a začíná znovu. Takže byste mohli mít jeden obvod se 100 členy, další s 5, další se 17...

Takže váš poslední dotaz obsahuje všechny s jejich příslušnými pozicemi... Nyní použijte HAVING the finální okresní pořadí =1... Tímto způsobem můžete také upravit nutnost získat 3 nejlepší členy na okres (např. )...

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

UPRAVIT PODLE ZPĚTNÉ VAZBY Pokud jeho agregace zabírá čas, pak bych udělal následující. Vytvořte novou tabulku, která nebude obsahovat nic jiného než agregace podle okresu, název a počáteční hodnost pro okres. Když je do této tabulky přidán jakýkoli nový záznam, spouštěč pak přidá jeden do celkového počtu v tabulce, poté zkontroluje, kde se tato osoba nachází v jejich okrese, a znovu aktualizuje svou novou pozici v hodnosti. Mohli byste to udělat ještě o krok dále a mít další tabulku pouze „TOP“ členů na okresní tabulku, což je jedna na okres se jménem osoby. Když nový člověk dosáhne nejvyšší pozice, jeho jméno se zapíše do tabulky a přepíše se ten, kdo tam byl jako poslední.



  1. Odstranit řádek, pokud tabulka existuje SQL

  2. Zaznamenávat VŠECHNY dotazy do databáze SQL Server 2008 Express?

  3. Jak vložit dlouhý řetězec do datového typu CLOB v Oracle

  4. Použití LIKE v bindParam pro dotaz MySQL PDO