Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql - имате нужда от две ограничения?

Ще трябва да го направите, като приложите "ранг" за дистрикт, след което само вземете за ранг =1... @LastDistrict на мястото на присъединяване е зададено на нула по подразбиране, в случай че районът се основава на идентификатор. Ако районът е базиран на символи, можете просто да го промените на ="" вместо това, за да съответства на типа данни.

За да се изясни какво се случва. Предварителната заявка "AwardCounts" изпълнява цялата заявка за дистрикт и член с колкото и награди да се броят. След това, подредено по дистрикт и брой награди на членове (надолу), като по този начин най-високият брой награди се поставя на първа позиция за дистрикт.

Това е свързано с друг фалшив псевдоним "SQLVars", който просто създава вградени променливи към заявката, наречена @RankSeq и @LastDistrict. Така че, първият път в, "DistRankSeq" ще стане 1 за първия дистрикт, след което ще зареди "@LastDistrict" със стойността на дистрикта. Следващият запис за същия дистрикт (тъй като ще бъде в правилен ред) ще получи ранг от 2, след това 3 и т.н.... Когато има промяна от какъвто и да е бил "ПОСЛЕДНИЯТ" дистрикт към новия запис се тестван, рангът се връща на 1 и започва отново. Така че можете да имате един дистрикт със 100 членове, друг с 5, друг със 17...

Така че, вашата последна заявка има всички от тях със съответните им рангове... Сега приложете ИМАЩ крайния ранг на дистрикта =1... Правейки това, можете също да коригирате необходимостта да получите първите 3 членове на дистрикт (например )...

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

РЕДАКТИРАНЕ НА ОТЗИВ Ако агрегирането отнема време, тогава бих направил следното. Създайте нова таблица с нищо освен агрегирания по район, име и начален ранг за дистрикта. Тъй като всеки нов запис се добавя към тази таблица, тригерът след това добавя един към общия брой на таблицата, след което проверява къде се намира този човек в техния район и актуализира отново новата си позиция в ранг. Бихте могли да направите още една крачка напред и да имате друга маса само с "ТОП" член на маса на дистрикт, която е по една на дистрикт с името на лицето. Когато нов човек достигне горната позиция, името му се поставя в таблицата, като се презаписва кой е бил там последен.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP-MySQL-Как безопасно да увеличите целочисленото поле на MySQL?

  2. показване на данни от базата данни в падащия CodeIgniter

  3. Времето за изчакване на JDBC връзката не може да се свърже отново

  4. Вмъкване/актуализиране на помощна функция с помощта на PDO

  5. Чувствителни ли са имената на колона и таблица в MySQL?