我有一个包含membergroupids的用户表,用户表如下所示:
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循环结果并获取计数,但它适用于小的用户表集,但我有一个非常大的用户表,选择查询本身将采取超过1分钟完成,还有更好的方法吗?
答案 0 :(得分:3)
有一个很多更好的方法来做到这一点。您的表需要标准化:
而不是
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个成员组,则可以使用like '%1%'
查找membergroupid#1的所有用户ID。但是如果你有10,那么它将无法区分1和10.可悲的是,你不能指望逗号来帮助你区分,因为数字可能不会被逗号包围。
...除非
您可以创建一个新字段并使用membergroupids
填充该字段,并使用逗号将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,%';
你可以创建一个循环遍历所有成员组的PHP脚本。
请记住,like %...%
效率不高,所以不要考虑依靠这个来计算。它会工作,但它不可扩展。使用它来构建规范化表会好得多。
答案 1 :(得分:0)