sql >> Database teknologi >  >> RDS >> Mysql

Deltager i Streak MySQL-forespørgsel

Lad os antage, at din tabel er Event og kolonnerne er EventID og Name . Vi kan bestemme rækkefølgen (dvs. 1, 2, 3 osv.), hvori hver person deltog i begivenheder, ved hjælp af følgende forespørgsel:

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

Vi kan udnytte PersonalEventSequence for at gruppere hver persons begivenheder i streger:

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

Nu hvor hver persons begivenheder er grupperet i streger (har ganske vist underlige StreakGroup-numre!), kan vi bestemme længden af ​​hver persons streaks:

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

Nu hvor vi kender længden af ​​hver persons streger, kan vi bestemme længden af ​​hver persons længste streak:

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

Bemærkninger:

  • OP'en ønskede kun aktuelle streaks (dvs. streaks, der inkluderer den seneste begivenhed), men jeg overlader den specifikke løsning til OP at finde ud af, da den generelle løsning, der er vist her, vil være anvendelig for flere programmører.
  • Koden kunne ryddes op ved at bruge Views i stedet for underforespørgsler.
  • Jeg har ikke prøvet at køre denne kode. Der kan være fejl.


  1. For mange borde; MySQL kan kun bruge 61 tabeller i en join

  2. MySQL:Opdel kommasepareret liste i flere rækker

  3. Bedste måde at udvikle/administrere/designe tilbagevendende opgaver/kalender

  4. SQL - Find manglende int-værdier i for det meste ordnede sekventielle serier