mysql - 按部分行分组

时间:2017-08-06 10:25:49

标签: mysql database

使用mysql,假设我的表看起来像这样:

| id | name   | type  
| 1  | name1  | type 1
| 2  | name2  | type 2
| 3  | name3  | type 2
| 4  | name4  | type 3
| 5  | name4  | type 4
| 6  | name5  | type 2
| 7  | name6  | type 3

我希望从表中获取所有行,并将所有类型2分组为一行。
 在这个例子中,行是id 2还是3并不重要。

结果应如下所示:

    | id | name   | type  
    | 1  | name1  | type 1
    | 3  | name3  | type 2
    | 4  | name4  | type 3
    | 5  | name4  | type 4
    | 7  | name6  | type 3

1 个答案:

答案 0 :(得分:0)

我猜你想要type的每个值只有一行的结果集。您的示例表显示了三个不同的行,typetype 2,其中一个为type个值。

此查询每type返回一行,显示每种类型的id值最大的行。如果id是自动增量主键,则表示它显示具有该类型的最近插入的行。 (http://sqlfiddle.com/#!9/1f8c54/3/0

SELECT a.id, a.name, a.type
  FROM tbl a
  JOIN (
              SELECT MAX(id) id
                FROM tbl
               GROUP BY type
       ) m ON a.id = m.id
 GROUP BY type

您可以更改子查询(SELECT MAX(id)...)以为您的应用选择合适的行。例如,MIN(id)提供最近插入的行。

如果您只想对type的一个值执行数据减少操作,则需要UNION从其他type值中恢复详细信息行。 (http://sqlfiddle.com/#!9/1f8c54/8/0

SELECT * 
 FROM (
    SELECT a.id, a.name, a.type
      FROM tbl a
      JOIN (
                  SELECT MAX(id) id
                    FROM tbl
                   GROUP BY type
           ) m ON a.id = m.id
     WHERE type = 'type 2'
     GROUP BY type
     UNION
    SELECT id, name, type
      FROM tbl
     WHERE type <> 'type 2'
   ) q
ORDER BY type, id