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

Tham dự Streak MySQL Query

Giả sử bảng của bạn là Event và các cột là EventIDName . Chúng tôi có thể xác định trình tự (tức là 1, 2, 3, v.v.) trong đó mỗi người đã tham dự các sự kiện bằng truy vấn sau:

SELECT
  e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
  Event e1
    INNER JOIN
  Event e2
    ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
  e1.Name, e1.EventID

Chúng ta có thể tận dụng PersonalEventSequence để nhóm các sự kiện của mỗi người thành các chuỗi:

SELECT
  Name, EventID - PersonalEventSequence AS StreakGroup
FROM
  (
    SELECT
      e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
    FROM
      Event e1
        INNER JOIN
      Event e2
        ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
    GROUP BY
      e1.Name, e1.EventID
  ) AS SubQuery1

Giờ đây, các sự kiện của mỗi người được nhóm thành các vệt (có số StreakGroup phải thừa nhận là kỳ lạ!), Chúng tôi có thể xác định độ dài của các vệt của mỗi người:

SELECT
  Name, StreakGroup, COUNT(*) AS StreakLength
FROM
  (
    SELECT
      Name, EventID - PersonalEventSequence AS StreakGroup
    FROM
      (
        SELECT
          e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
        FROM
          Event e1
            INNER JOIN
          Event e2
            ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
        GROUP BY
          e1.Name, e1.EventID
      ) AS SubQuery1
  ) SubQuery2
GROUP BY
  Name, StreakGroup

Bây giờ chúng ta đã biết độ dài vệt dài của mỗi người, chúng ta có thể xác định độ dài vệt dài nhất của mỗi người:

SELECT
  Name, MAX(StreakLength) AS PersonalRecordStreakLength
FROM
  (
    SELECT
      Name, StreakGroup, COUNT(*) AS StreakLength
    FROM
      (
        SELECT
          Name, EventID - PersonalEventSequence AS StreakGroup
        FROM
          (
            SELECT
              e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
            FROM
              Event e1
                INNER JOIN
              Event e2
                ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
            GROUP BY
              e1.Name, e1.EventID
          ) AS SubQuery1
      ) SubQuery2
    GROUP BY
      Name, StreakGroup
  ) SubQuery3
GROUP BY
  Name

Ghi chú:

  • OP chỉ muốn các vệt hiện tại (tức là các vệt bao gồm sự kiện mới nhất), nhưng tôi để giải pháp cụ thể đó cho OP tìm ra vì giải pháp chung hiển thị ở đây sẽ có thể áp dụng cho nhiều lập trình viên hơn.
  • Mã có thể được làm sạch bằng cách sử dụng Chế độ xem thay vì truy vấn con.
  • Tôi chưa thử chạy mã này. Có thể có lỗ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. Di chuyển Cơ sở dữ liệu Oracle sang MySQL trên AWS, Phần 2

  2. Cách giới hạn tìm kiếm và thay thế chuỗi trong mySQL

  3. Sử dụng một kết quả truy vấn trong một truy vấn khác

  4. Làm cách nào để tìm tất cả các chuỗi chữ hoa trong bảng MySQL?

  5. Tìm kiếm địa lý MYSQL có hiệu suất khoảng cách