提取GROUP BY的结果

时间:2011-05-09 14:02:05

标签: mysql group-by

假设我有一张这样的表:

name        | address
------------+----------------
JOHN SMITH  | 123 FAKE ST
JANE SMITH  | 123 FAKE ST
DAN JOHNSON | 456 WHATEVER RD

现在让我说我创建一个我GROUP BY address的视图,结果是这样的:

name                   | address         | group_id
-----------------------+-----------------+---------
JOHN SMITH, JANE SMITH | 123 FAKE ST     | 1
DAN JOHNSON            | 456 WHATEVER RD | 2

有没有办法,只使用SQL,“扩展”该分组的结果,像这样?

name        | address         | group_id
------------+-----------------+---------
JOHN SMITH  | 123 FAKE ST     | 1
JANE SMITH  | 123 FAKE ST     | 1
DAN JOHNSON | 456 WHATEVER RD | 2

3 个答案:

答案 0 :(得分:1)

一种选择是使用SUBSTRING_INDEX()功能。

查看此博客文章,其中定义了SPLIT_STRING()函数:mysql-split-string-function

答案 1 :(得分:0)

是的,因为ypercube注意到它是可能的,你需要一个SUBSTRING_INDEX函数。您还需要重新生成一些棘手的行,因为mysql不支持递归查询。

你可以做一个解决方法,这里有一个解决方案,假设最多3条记录只是为了说明:

SELECT SUBSTRING_INDEX(name, ',', 1), address, group_id
FROM aggregated a1
WHERE
UNION ALL
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(name, ',', 2), ',', -1), address, group_id
FROM aggregated a2
WHERE name LIKE '%,%'
UNION ALL
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(name, ',', 3), ',', -1), address, group_id
FROM aggregated a3
WHERE name LIKE '%,%,%'

上述方法的概念性丑陋和缺陷是建议您永远不要将其作为系统中正常的设计程序(性能也永远不会好)的原因之一:汇总记录被认为是表示层,不用于将任何内容写回数据库,并始终能够从未聚合的源中检索记录。

当你偏离上述规则时,你将不得不采取与上述相似的方法(支持递归查询的其他数据库可能做得更好,但是对于查询无法实现的事实没有神奇的灵丹妙药有效地使用列名称上的索引。

修改 我使用聚合为group_concat(和类似)的术语,这个术语不够具体。最好说 - 在单个字段中存储多个值(在单个列中重复组)。

答案 2 :(得分:-1)

使用GROUP BY a.name。你为什么要按地址分组?

您无论如何都会使用WHERE a.address=b.address