[英]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之間進行區分。可悲的是,您不能依靠逗號來幫助您進行區分,因為該數字可能不會被逗號包圍。
除非...
您可以創建一個新字段,並使用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 %...%
那樣效率不高,因此甚至不要考慮依靠它來進行計數。 可以,但是不能擴展。 最好使用它來建立規范化表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.