使用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
答案 0 :(得分:0)
我猜你想要type
的每个值只有一行的结果集。您的示例表显示了三个不同的行,type
为type 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