[英]count multiple row values separated by comma
我有一個多行的 MySQL 數據庫和一個包含一些文本的列,用逗號分隔。
快速了解一下,我的數據庫如下所示:
id | column
1 | aaa, bbb
2 | ccc, ddd, aaa
3 | eee, aaa, ccc
4 | ddd
輸出需要是這樣的:
aaa - 3
bbb - 1
ccc - 2
ddd - 2
eee - 1
我在網上到處搜索后,我仍然不知道該怎么做。 請善待並給我一些解決它的想法。
假設您的數據結構有原因,並且您不願意對數據庫進行規范化,那么您需要在 PHP 中執行此操作,但是如果沒有原因,我強烈建議進行規范化。
// This will come from the query, but for the example
$array = Array("aaa, bbb", "ccc, ddd, aaa", "eee, aaa, ccc", "ddd");
// Initilize an empty array for holding count values
$counterArray = Array();
// Loop through each "table row"
foreach ($array as $row)
{
// Split the row on the comma
$splitRow = explode(',', $row);
// Loop through each item found on the row
foreach ($splitRow as $item)
{
// Trim to get rid of any leading/trailing spaces
$arrayKey = trim($item);
// Check if the array contains the values already, if yes increment otherwise creaet a record with a initial value of 1
if (!array_key_exists($arrayKey, $counterArray))
$counterArray[$arrayKey] = 1;
else
$counterArray[$arrayKey]++;
}
}
// This will come from the query, but for the example
$array = Array("aaa, bbb", "ccc, ddd, aaa", "eee, aaa, ccc", "ddd");
print_r(array_count_values($array));
// you will get associative array with count.
毫無疑問,標准化您的數據庫是這里的最佳解決方案。 此外,正如其他答案所建議的那樣,以編程方式實現上述任務也將是一個簡單有效的解決方案。
但是,如果上述 2 個選項根本不適合您,那么以下是使用PL\\SQL實現它的方法。
1)如果你只想找到一個單詞的出現次數,你可以嘗試以下方法:
select
distinct
'aaa' as Word,
ROUND (
(
CHAR_LENGTH(@str)
- CHAR_LENGTH( REPLACE (@str, 'aaa', "") ) //you can put the word here you want
) / CHAR_LENGTH('aaa')
) AS count
from t
;
結果:
word | count
--------------
aaa | 3
2)如果你想顯示所有有問題的單詞的數量,你需要一個Function ,一個Procedure和一個Temp Table 。
第 1 步:創建一個臨時表。
create table temp(str varchar(10));
步驟2:創建一個功能將數據與分隔符分割,
與給定的位置。
CREATE FUNCTION SPLIT_STR
(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
現在,上面的函數將只拆分給定位置的數據。 為了拆分整個字符串,我們需要迭代這個函數。 這就是我們的第 3 步。
步驟3:創建Procedure迭代上述函數;
CREATE PROCEDURE ABC(IN fullstr varchar(1000))
BEGIN
DECLARE a INT Default 0;
DECLARE str VARCHAR(255);
simple_loop: LOOP
SET a=a+1;
SET str=SPLIT_STR(fullstr,",",a);
IF str='' THEN
LEAVE simple_loop;
END IF;
#Do Inserts into temp table here with str going into the row
insert into t1 values (str);
END LOOP simple_loop;
第 4 步:將整列存儲到一個變量中:
select @str:= group_concat(columnname separator ',') from t;
第 5 步:呼叫程序:
call abc(@str);
第 6 步:從temp
表中獲取計數:
select
str as word,
count(*) as occurence
from temp
group by str;
結果:
word | occurence
-------------------------
1 aaa | 3
2 bbb | 1
3 ccc | 2
4 ddd | 2
5 eee | 1
希望能幫助到你!
謝謝你們。
根據您的想法,我制作了一個糟糕的腳本來完成這項工作,而無需修改數據庫。 我的數據庫已經標准化,除了一張表的一列(女巫的設計目的不是像我的例子那樣使用)。 我將在這里描述腳本,供需要它的更多用戶使用。
我的列只能包含 0-5 個預定義的單詞,逗號分隔。
對於每個單詞,我都為他的名字分配了一個 $var。 然后,在來自 MySQL 的 while 循環中,我檢查字符串是否包含該詞。
if(strpos($domeniu,'Producator') !== false){$producator = $producator + $count_domeniu;}
.
對每個單詞重復代碼。
Producer是 5 中的一個詞,較早地進行了預定義。
$producator是 $var 定義的 0,在 while 循環之前。
$count_domenu = $row['count_domenu'];
在 While 循環之后,echo $producator var。
我的 mysql 查詢是("SELECT domeniu_activitate, COUNT(domeniu_activitate) as count_domeniu FROM tbl_expozanti GROUP BY domeniu_activitate")
。
這是一個古老的問題,但在遇到同樣的問題時,我也在尋找答案時來到這里,所以其他人也可以。 終於為自己找到了完美的答案,它也可以通過簡單的 MySQL 查詢方式為您工作。 所以這里是一個簡單的查詢來計算由逗號分隔的多個行值。
根據您的表格,數據的結構以某種方式...
id | column
1 | aaa, bbb
2 | ccc, ddd, aaa
3 | eee, aaa, ccc
4 | ddd
因此,要獲得答案,只需使用以下查詢...
SELECT substring_index(column, ',', -1) AS columnTextRenamed, COUNT(substring_index(column, ',', -1)) AS columnCountRenamed
FROM my_table_name
GROUP BY columnTextRenamed
ORDER BY columnTextRenamed;
然后這將輸出為...
columnTextRenamed | columnCountRenamed
aaa | 3
bbb | 1
ccc | 2
ddd | 2
eee | 1
這就是你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.