参加Streak MySQL查询

时间:2012-02-28 03:33:04

标签: mysql

我正在研究一个试图想出你目前的出勤记录是什么的查询。换句话说,第1人参加了最后5场比赛,第2组参加了最后6场比赛等等。我为此获得的数据文件非常简单:

Event Number - Unique Name
34 - Tim
34 - John
34 - Mike
34 - Larry
35 - John
35 - Mike
35 - Larry
35 - Paul
36 - John
36 - Steve
36 - Paul

并且有希望产生endstate查询结果:

John - 3
Paul - 2
Steve - 1

这里另外有趣的部分是已经发生了数百个事件,还有数百个已经/没有参加过的人。我已经找到了几篇关于当前条纹的mysql查询的文章,但是如果每个可能的人都没有明确的是/否,那就没有。

有关如何构建此内容的任何想法?


伙计们 - 感谢快速回复!让我澄清一下,但是......我并不是想让每个人参加完毕的活动。相反,对于参加最后一场比赛的每个人来说,他们至少有一连串的1.但如果你参加了最后一场比赛,并且你也参加了最后5场比赛,你的连胜将是5.那就是这种情况。即使您在过去3年中参加了100场比赛,如果您错过了约会,然后出现在最后5个可能的日期,那么您的连胜纪录就是5.我想为参加最后一场比赛的所有人做这件事。

3 个答案:

答案 0 :(得分:3)

我们假设您的表格为Event,且列为EventIDName。我们可以通过以下查询确定每个人参加活动的顺序(即1,2,3等):

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

我们可以利用PersonalEventSequence将每个人的事件分组为条纹:

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

既然每个人的事件都被分组为条纹(肯定是奇怪的StreakGroup号码!),我们可以确定每个人的条纹长度:

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

现在我们知道每个人的条纹长度,我们可以确定每个人最长条纹的长度:

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

注意:

  • OP只想要当前条纹(即包含最新事件的条纹),但我将该特定解决方案留给OP来解决,因为此处显示的一般解决方案将适用于更多程序员。
  • 可以使用Views而不是子查询来清理代码。
  • 我没有尝试过运行此代码。可能有错误。

答案 1 :(得分:0)

我认为会是:

SELECT unique_name, count(event_number)
FROM <table>
GROUP BY unique_name
ORDER BY count(event_number) Desc

除非我遗漏了某些东西

答案 2 :(得分:0)

试试这个:

SELECT    UniqueName, COUNT(*) as AttendedEventCount 
FROM      tableName
GROUP BY  UniqueName