簡體   English   中英

如何使用SQL計算數組中的每個項目

[英]How to count each item in array with sql

我有一個包含成員組標識的用戶表,用戶表如下所示:

userid   membergroupids
1        1,2
2        2,3
3        2,3,4

我想使用sql輸出這樣的結果

membergroupid    count
1                1
2                3
3                2
4                1

我嘗試使用SELECT membergroupids FROM user ,然后使用php遍歷結果並獲取計數,但是它適用於用戶表的設置少,但是我有一個非常大的用戶表,select查詢本身要花費超過1分鍾的時間完成,有更好的方法嗎?

有一種更好的方法來做到這一點。 您的表需要規范化:

代替

userid   membergroupids
1        1,2
2        2,3
3        2,3,4

它必須是

userid   membergroupids
1        1
1        2
2        2
2        3
3        2
3        3
3        4

從這里開始,這是一個獲取計數的簡單查詢(假設此表稱為your_table

select count(membergroupids) as numberofgroups, userid 
from your_table 
group by userid 
order by userid

那么,真正的問題是使您的表規范化。 如果只有9個membergroupid,則可以使用like '%1%'來查找具有membergroupid#1的所有用戶ID。 但是,如果您有10個,則將無法在1和10之間進行區分。可悲的是,您不能依靠逗號來幫助您進行區分,因為該數字可能不會被逗號包圍。

除非...

使用逗號封裝的組ID創建新字段

您可以創建一個新字段,並使用membergroupids填充該字段,並使用concat其用逗號concat (請檢查數據庫的文檔)。 這句話:

update your_table set temp=concat(',', membergroupids, ',');

這樣可以為您提供一個表結構,如下所示:

userid   membergroupids  temp
1        1,2             ,1,2,
2        2,3             ,2,3,
3        2,3,4           ,2,3,4,

現在,您可以在新字段中捕獲不同的成員組ID,即, where temp like '%,1,%'可以找到具有membergroupid 1的用戶ID。(它們將用逗號封裝)現在,您可以手動構建您的新規范化表,我將其稱為user_member

插入membergroupid 1:

insert into user_member (userid,membergroupid) select userid,'1' from your_table where temp like '%,1,%';

您可以制作一個遍歷所有membergroupids的php腳本。

請記住, like %...%那樣效率不高,因此甚至不要考慮依靠它來進行計數。 可以,但是不能擴展。 最好使用它來建立規范化表。

如果數據結構如下所示,則很容易實現您的目的:

數據表

SELECT `membergroupids`, COUNT(`membergroupids`) as 
CountOfMembergroupids FROM `TBL_TEST01` WHERE 1 
GROUP BY `membergroupids`
ORDER BY `userid`

結果

正如您提到的那樣,您必須繼續處理大量數據...,我強烈建議您可以如上所述修改表結構...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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