簡體   English   中英

計算以逗號分隔的多行值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM