2014-06-13 48 views
-2

我有一個小問題算相同的字符串,我要計數相同字符串數組,
例如 我的表是這樣的:如何在一個數組

id |  data 
    --------------------------- 
    1 | @user1,@user2,@user3 
    2 | @user1,@user4 
    3 | @user1,@user5 
    4 | @user2,@user3 

我怎麼能算@ USER1 ,@ user2等。?

+0

不知道你想問.. – Karl

+2

你所需的輸出是不明確的,所以是不是一個神奇的代碼生成反正什麼。 _your_代碼在哪裏?你有什麼想法?在實施它們時,你面臨什麼問題?在提交之前,您還應該_format_您的文章。所有這些都在幫助中心和常識中介紹。 –

+0

我想統計在我的列數據中有多少@ user1。 – TheJoker

回答

0

您可以使用find_in_set在逗號分隔的字段中查找數據。

SELECT COUNT(*) 
FROM some_table 
WHERE FIND_IN_SET('@user2', data) 

這會給你一個包含這個字符串的行數。

請注意,這確實表明數據庫設計未規範化,並且由於此函數無法使用索引,因此與正常規範化的數據庫相比,該函數可能執行得不好(即將字符串拆分到不同的表上)每個ID每個字符串一行)。

編輯 - 如果你希望所有的字符串的計數: -

SELECT sub1.aString, COUNT(*) 
FROM 
(
    SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 1 + units.i + 10 * tens.i), ',', -1) AS aString 
    FROM some_table, 
    (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units, 
    (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
) sub1 
INNER JOIN some_table 
ON FIND_IN_SET(sub1.aString, data) 
GROUP BY sub1.aString 

它使用了幾個子查詢,生成100行的每一行中,你主表,每個號碼的組合0到9兩次。從組合它可以計算0到99之間的數字(可以輕鬆擴展以添加另一個子查詢,從0到999或更多)。然後它使用SUBSTRING_INDEX和生成的數字來分隔每行數據中可能的字符串。這會產生很多重複,部分原因是這些字符串可能會在很多行上,部分原因是每行的最後一個字符串會被多次輸出(即,如果有10個字符串,最後一個字符串將被放棄91由於使用SUBSTRING_INDEX的方式而導致的時間)。 DISTINCT用於刪除這些重複項。

然後使用FIND_IN_SET將結果與您的表結合起來,並且COUNT/GROUP BY用於獲取所有字符串的所有計數。

+0

謝謝,它的工作原理 – TheJoker

+0

我想爲每個@ user2,@ user3做到這一點,是否有可能? – TheJoker

+0

您是否希望爲數據字段中的每個字符串提供此信息?或者只是選擇他們。無論哪種方式都是凌亂的 – Kickstart

0

你可以嘗試這樣的財產以後: -

SELECT COUNT(data) 
FROM your_table 
WHERE data LIKE '%@user1%'