由带分隔符的字符串分组

You*_*sef 5 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,  |
+----+------------+
Run Code Online (Sandbox Code Playgroud)

如何按照id这种方式分组,而group by ','id','不是group by id得到这样的结果:

+----+------------+
| id | count      |
+----+------------+
|  1 | 4          |
|  2 | 3          |
|  3 | 3          |
|  4 | 2          |
|  5 | 2          |
|  6 | 1          |
|  7 | 1          |
+----+------------+
Run Code Online (Sandbox Code Playgroud)

我的要求是找到id整列中的计数ancestors.

Qua*_*noi 6

SELECT  m1.id, COUNT(*)
FROM    mytable m1
JOIN    mytable m2
ON      FIND_IN_SET(m1.id, m2.ancestors)
GROUP BY
        m1.id
Run Code Online (Sandbox Code Playgroud)

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


Sar*_*dra 1

您的要求似乎是在整个列中count找到idancestors找到 的。

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

SELECT a.id, 
(SELECT count(*) FROM ancestors_table t where t.ancestors LIKE CONCAT('%,',a.id,',%') )
  FROM ancestors_table a; 
Run Code Online (Sandbox Code Playgroud)

在这里使用 SQLFiddle

更新:修复了两位数或更多数字的问题。1 将仅匹配 1。而不是 10、11 等。这是可能的,因为您的列附加,在每个值周围。