2016-04-27 39 views
5

字符串我有一个表,其中我省对每条记录他的祖先集团用分隔符

+----+------------+ 
| 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   | 
+----+------------+ 

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

+0

请提供更多详细信息:模式详细信息,表结构/详细信息,正在使用的完整查询。当然,SQLFiddle会好很多! – SarathChandra

+0

这是违反规范化的基本规则。祖先表应该有多行,祖先的原子值。假设你有2个父母,你最多有2行。你的榜样也没有意义。对于id 1,你有1作为祖先?为什么?你不是你自己的父母。 – gview

+0

@gview总是遵循规范化的规则,它并不总是最好的选择,只是做出选择适合你的问题的解决方案。在我的情况下,如果我尊重我不能查询所有记录的下降规范化 – Youssef

回答

1

您的要求似乎是在ancestors的整列中找到idcount

因此,在一个相关的子查询中使用COUNT要细,如下:

SELECT a.id, 
(SELECT count(*) FROM ancestors_table t where t.ancestors LIKE CONCAT('%,',a.id,',%')) 
    FROM ancestors_table a; 

工作SQLFiddle here.

UPDATE:修正该问题为2位或更多的数字。 1将只匹配1.不是10,11等。这是可能的,因为您的列在每个值附近都附加,

+0

是的,这是我的要求,但性能和'concat'或'REGEXP'运算符怎么样? – Youssef

+1

只要您有两位数或更多的数字,这将返回不正确的结果。 1不仅会匹配1,而且还会匹配10,11等。 – Quassnoi

+0

@Quassnoi带'concat'操作比'FIND_IN_SET'更快吗? – Youssef

6
SELECT m1.id, COUNT(*) 
FROM mytable m1 
JOIN mytable m2 
ON  FIND_IN_SET(m1.id, m2.ancestors) 
GROUP BY 
     m1.id 

请注意,它不是一个有效的方法,并且随着数据库变大,它会变得更慢。

+0

谢谢你,但我不明白'FIND_IN_SET'函数,我在搜索方法中使用它,恐怕它减慢了请求的速度。也是'jpa'或'hibenrate'这个工作吗? – Youssef

+1

是的,正如我所说的这个功能不适合索引。它将在任何能够将此查询提交给MySQL的系统中工作。你可以使用'FULLTEXT'索引来改善这一点,但是'MATCH'不幸的是在MySQL的连接条件下不起作用。 – Quassnoi