MySQL分组连续出现

前端之家收集整理的这篇文章主要介绍了MySQL分组连续出现 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想按列值的连续出现将查询结果分组.假设我有一张表格,其中列出了每年比赛的获胜者,如下所示:

year    team_name
2000    AAA
2001    CCC
2002    CCC
2003    BBB
2004    AAA
2005    AAA
2006    AAA

我想要一个查询,输出

start_end    total   team_name
2000         1       AAA
2001-2002    2       CCC
2003         1       BBB
2004-2006    3       AAA

只要我有开始和结束或范围(例如,可以使用GROUP_CONCAT生成2004,2005,2006而不是2004-2006,我就不用太担心“ start_end”的格式,那仍然可以) ).

最佳答案
只要您的表格如下所示:

"id";"year";"team"
"1";"2000";"AAA"
"2";"2001";"CCC"
"3";"2002";"CCC"
"4";"2003";"BBB"
"5";"2004";"AAA"
"6";"2005";"AAA"
"7";"2006";"AAA"

这个查询应该可以解决这个问题:

SELECT a.year AS start,MIN(c.year) AS end,MIN(c.year)-a.year+1 AS total,CONCAT_WS('-',a.year,IF(a.year = min(c.year),NULL,min(c.year))) as start_end,a.team
  FROM 
     ( SELECT x.year,x.team,COUNT(*) id
         FROM results x
         JOIN results y
           ON y.year <= x.year
        GROUP BY x.id
     ) AS a
  LEFT JOIN 
     ( SELECT x.year,COUNT(*) id 
         FROM results x
         JOIN results y
           ON y.year <= x.year
        GROUP BY x.id
     ) AS b ON a.id = b.id + 1 AND b.team = a.team
  LEFT JOIN  
     ( SELECT x.year,COUNT(*) id 
         FROM results x
         JOIN results y
           ON y.year <= x.year
        GROUP BY x.id
     ) AS c ON a.id <= c.id AND c.team = a.team
  LEFT JOIN 
     ( SELECT x.year,COUNT(*) id 
         FROM results x
         JOIN results y
           ON y.year <= x.year
        GROUP BY x.id
     ) AS d ON c.id = d.id - 1 AND d.team = c.team
WHERE b.id IS NULL AND c.id IS NOT NULL AND d.id IS NULL
GROUP BY start;

顺便说一句,您可能会发现Common Queries Tree可以轻松解决这些问题(请查看“查找序列中的上一个和下一个值”的答案):p.

猜你在找的MySQL相关文章