2016-04-27 37 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