Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql - potrzebujesz dwóch limitów?

Musisz to zrobić, stosując „rangę” na dzielnicę, a następnie pobieraj tylko za rangę =1... @LastDistrict w lokalizacji przyłączenia jest domyślnie zerowe, w przypadku gdy dzielnica jest oparta na identyfikatorze. Jeśli okręg jest oparty na znakach, możesz po prostu zmienić go na =„”, aby dopasować typ danych.

Aby wyjaśnić, co się dzieje. Zapytanie wstępne „AwardCounts” wykonuje całe zapytanie dla dystryktu i członka z dowolną liczbą nagród. Następnie, uporządkowane według okręgu i liczby nagród dla członków (malejąco), umieszczając w ten sposób najwyższą liczbę nagród na pierwszej pozycji w okręgu.

Jest to połączone z innym fałszywym aliasem „SQLVars”, który po prostu tworzy zmienne wbudowane do zapytania o nazwie @RankSeq i @LastDistrict. Tak więc za pierwszym razem „DistRankSeq” zmieni się na 1 dla pierwszej dzielnicy, a następnie wpisz „@LastDistrict” wartością tej dzielnicy. Następny wpis dla tego samego okręgu (ponieważ będzie w odpowiedniej kolejności) otrzyma rangę 2, potem 3, itd... Gdy nastąpi zmiana z tego, co był w "OSTATNIM" Okręgu, na nowy rekord testowane, ranga zostaje cofnięta do 1 i zaczyna się od nowa. Więc możesz mieć jeden okręg ze 100 członkami, inny z 5, inny z 17...

Tak więc, twoje ostatnie zapytanie zawiera je wszystkie z odpowiednimi rangami... Teraz zastosuj MIEJĄC ostateczną rangę okręgu =1... W ten sposób możesz również dostosować konieczność uzyskania 3 najlepszych członków na dzielnicę (na przykład )...

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

EDYTUJ NA OPINIE Jeśli agregacja zajmuje trochę czasu, zrobiłbym to, co następuje. Utwórz nową tabelę zawierającą wyłącznie agregacje dla okręgu, nazwę i początkową rangę okręgu. Gdy do tej tabeli dodawany jest nowy rekord, wyzwalacz dodaje jeden do łącznej liczby tabel, a następnie sprawdza, gdzie dana osoba znajduje się w swoim okręgu, i ponownie aktualizuje swoją nową pozycję w rankingu. Możesz pójść o krok dalej i mieć kolejny stół z „TOP” członkiem na tabelę okręgu, czyli po jednym na okręg z imieniem i nazwiskiem osoby. Kiedy nowa osoba osiąga najwyższą pozycję, jej imię jest umieszczane w tabeli, zastępując ostatniego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. org.hibernate.AssertionFailure:null id we wpisie (nie opróżniaj sesji po wystąpieniu wyjątku)

  2. mysql -> wstaw do tbl (wybierz z innej tabeli) i kilka wartości domyślnych

  3. Najszybszy sposób na znalezienie odległości między dwoma punktami szerokości/długości

  4. Mysql Połącz dwie kolumny podczas wyszukiwania za pomocą LIKE

  5. Railsy:Wymuś pusty ciąg na NULL w bazie danych