Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

mysql - cần hai giới hạn?

Bạn sẽ phải làm điều đó bằng cách áp dụng "xếp hạng" cho mỗi quận, sau đó chỉ lấy mỗi xếp hạng =1 ... @LastDistrict tại vị trí tham gia được mặc định là 0, trong trường hợp quận dựa trên ID. Nếu quận dựa trên ký tự, bạn chỉ có thể thay đổi thành ="" để phù hợp với kiểu dữ liệu.

Để làm rõ những gì đang xảy ra. Truy vấn trước "AwardCounts" thực hiện toàn bộ truy vấn cho mỗi học khu và thành viên với số lượng phần thưởng bao nhiêu. Sau đó, được sắp xếp theo quận và số lượng giải thưởng thành viên (giảm dần), do đó đặt tổng số giải thưởng cao nhất ở vị trí đầu tiên cho mỗi quận.

Điều đó được kết hợp với một bí danh không có thật khác "SQLVars" chỉ tạo các biến nội tuyến cho truy vấn có tên @RankSeq và @LastDistrict. Vì vậy, trong lần đầu tiên, "DistRankSeq" sẽ trở thành 1 cho quận đầu tiên, sau đó đặt "@LastDistrict" bằng giá trị của quận. Mục nhập tiếp theo cho cùng một quận (vì nó sẽ theo thứ tự trình tự thích hợp) sẽ được chỉ định thứ hạng là 2, rồi 3, v.v. Khi có sự thay đổi từ bất kỳ Quận "CUỐI" nào là hồ sơ mới đã kiểm tra, xếp hạng được đặt trở lại 1 và bắt đầu lại. Vì vậy, bạn có thể có một quận với 100 thành viên, một quận khác có 5 thành viên, quận khác có 17 ...

Vì vậy, truy vấn cuối cùng của bạn có tất cả chúng với các cấp bậc tương ứng của chúng ... Bây giờ, hãy áp dụng ĐÃ CÓ xếp hạng cuối cùng của huyện =1 ... Làm điều này, bạn cũng có thể điều chỉnh việc phải có được 3 thành viên hàng đầu cho mỗi huyện (ví dụ:) ...

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

CHỈNH SỬA MỖI PHẢN HỒI Nếu sự tổng hợp của nó chiếm nhiều thời gian, thì tôi sẽ làm như sau. Tạo một bảng mới không có gì ngoài các tổng hợp theo quận, tên và xếp hạng ban đầu cho quận. Khi bất kỳ bản ghi mới nào được thêm vào bảng này, trình kích hoạt sẽ thêm một bản ghi vào bảng tổng hợp, sau đó kiểm tra vị trí của người đó trong quận của họ và cập nhật lại vị trí xếp hạng mới của họ. Bạn có thể tiến thêm một bước nữa và có một bảng khác chỉ gồm thành viên "TOP" trên mỗi bảng quận là một bảng cho mỗi quận có tên của người đó. Khi một người mới đạt được vị trí cao nhất, tên của họ sẽ được đưa vào bảng, ghi đè lên những người đã ở đó lần cuối.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chọn tất cả các ngày giữa hai ngày không sử dụng bảng (tạo danh sách ngày)

  2. Sử dụng ALTER để thả một cột nếu nó tồn tại trong MySQL

  3. Không thể thêm trình điều khiển mysql vào jboss

  4. Cập nhật cột trong cơ sở dữ liệu nơi có giá trị tối đa php mysql

  5. Làm thế nào để lưu trữ một giá trị phần trăm?