如何用sql

时间:2018-04-25 00:30:53

标签: php mysql

我有一个包含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分钟完成,还有更好的方法吗?

2 个答案:

答案 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.可悲的是,你不能指望逗号来帮助你区分,因为数字可能不会被逗号包围。

...除非

使用逗号

封装的组ID创建新字段

您可以创建一个新字段并使用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)

  

如果数据结构如下所示,很容易实现您的目的:

DATA TABLE

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

RESULT

  

正如您所说,您必须继续处理大量数据......,我强烈建议您修改上面的表格结构......