由带分隔符的字符串分组

时间:2016-04-27 21:53:43

标签: mysql sql

我有一张桌子,我为每个记录保存他的祖先

+----+------------+
| id | ancestors  |
+----+------------+
|  1 | ,1,        |
|  2 | ,2,        |
|  3 | ,3,1,      |
|  4 | ,4,2,      |
|  5 | ,5,3,1,    |
|  6 | ,6,4,2,    |
|  7 | ,7,5,3,1,  |
+----+------------+

如何按id分组,但是这样group by ','id','而不是group by id来获得这样的结果:

+----+------------+
| id | count      |
+----+------------+
|  1 | 4          |
|  2 | 3          |
|  3 | 3          |
|  4 | 2          |
|  5 | 2          |
|  6 | 1          |
|  7 | 1          |
+----+------------+

我的要求是在id的整栏中找到ancestors的计数。

2 个答案:

答案 0 :(得分:6)

SELECT 
PERSONID
,COALESCE(MAX(CASE WHEN phoneTypeId = '3' THEN SUBSTRING(Phone,1,12) END), '') as 'TYPE1'
,COALESCE(MAX(CASE WHEN phoneTypeId = '2' THEN SUBSTRING(Phone,1,12) END), '') as 'TYPE2'
,COALESCE(MAX(CASE WHEN phoneTypeId = '5' THEN SUBSTRING(Phone,1,12) END), '') as 'TYPE3'
FROM personphone
WHERE len(phone) = 12
GROUP BY personid
order by personid

请注意,它不是一种有效的方法,随着数据库变大,它会变慢。

答案 1 :(得分:1)

您的要求似乎是在count的整栏中找到id的{​​{1}}。

因此,依赖子查询中的使用ancestors应该没问题,如下所示:

COUNT

使用SQLFiddle here.

更新:修正了两位数或更多数字的问题。 1将仅匹配1.不是10,11等。这是可能的,因为您的列会在每个值附近附加SELECT a.id, (SELECT count(*) FROM ancestors_table t where t.ancestors LIKE CONCAT('%,',a.id,',%') ) FROM ancestors_table a;