mysql:按相同的字段值对周围记录进行分组

时间:2014-06-30 17:42:31

标签: mysql sql join

我有一个包含以下结构和数据的表:

id | type | title
--------------------------
1  | 1    | test 1
2  | 1    | test 2
3  | 2    | test 3
4  | 2    | test 4
5  | 1    | test 5

我需要使用相同的type字段值对邻居行进行分组。

所以结果应该是:

type |
------
1    |
2    |
1    |

提前致谢。

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题..使用用户定义的变量。

SELECT 
    type 
FROM(
    SELECT 
        type,
        if(@a = type, @b, @b := @b + 1) as grouping_col,
        @a := type
    FROM testing
    JOIN (select @a := 1, @b := 0) as temp
) as t
GROUP BY grouping_col;

SQL FIDDLE

一起玩

答案 1 :(得分:0)

这是一种方法 - 尽管使用变量的解决方案可以更好地扩展......

 DROP TABLE IF EXISTS my_table;

 CREATE TABLE my_table
 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
 ,type INT NOT NULL 
 ,title VARCHAR(12) NOT NULL
 );

 INSERT INTO my_table VALUES
 (1,1,'test 1'),
 (3,1,'test 2'),
 (4,2,'test 3'),
 (7,2,'test 4'),
 (9,1,'test 5');

 SELECT * FROM my_table;
 +----+------+--------+
 | id | type | title  |
 +----+------+--------+
 |  1 |    1 | test 1 |
 |  3 |    1 | test 2 |
 |  4 |    2 | test 3 |
 |  7 |    2 | test 4 |
 |  9 |    1 | test 5 |
 +----+------+--------+  

 SELECT a.id start
      , MIN(c.id) End 
      , a.type
   FROM 
      ( SELECT x.*,COUNT(*) rank FROM my_table x JOIN my_table y ON y.id <= x.id GROUP BY x.id) a
   LEFT 
   JOIN 
      ( SELECT x.*,COUNT(*) rank FROM my_table x JOIN my_table y ON y.id <= x.id GROUP BY x.id) b 
     ON b.type = a.type
    AND b.rank = a.rank - 1
   LEFT 
   JOIN 
      ( SELECT x.*,COUNT(*) rank FROM my_table x JOIN my_table y ON y.id <= x.id GROUP BY x.id) c 
     ON c.type = a.type
    AND c.rank >= a.rank 
   LEFT 
   JOIN 
      ( SELECT x.*,COUNT(*) rank FROM my_table x JOIN my_table y ON y.id <= x.id GROUP BY x.id) d 
     ON d.type = a.type
    AND d.rank = c.rank + 1
  WHERE b.id IS NULL 
    AND c.id IS NOT NULL
    AND d.id IS NULL
  GROUP 
     BY a.id; 
+-------+------+------+
| start | End  | type |
+-------+------+------+
|     1 |    3 |    1 |
|     4 |    7 |    2 |
|     9 |    9 |    1 |
+-------+------+------+