如何通过PHP从数据库中获取组中的总用户数

如何通过PHP从数据库中获取组中的总用户数,php,mysql,Php,Mysql,我在数据库中有两个表: 如何获取每个组的总用户数。i、 e:第1组:共有2名用户; 第2组:共有2个用户; 组3:总共是1个用户 SELECT group_name, COUNT(*) FROM user_table u, group_table g WHERE u.user_group_id LIKE %g.group_id% GROUP BY g.group_name; 这应该有效,并为您提供所有组的列表以及其中有多少用户。这不是对您特定问题的回答,而是一个可能更好的替代数据结构方案 引

我在数据库中有两个表:

如何获取每个组的总用户数。i、 e:第1组:共有2名用户; 第2组:共有2个用户; 组3:总共是1个用户

SELECT group_name, COUNT(*) FROM user_table u, group_table g WHERE u.user_group_id LIKE %g.group_id% GROUP BY g.group_name;

这应该有效,并为您提供所有组的列表以及其中有多少用户。

这不是对您特定问题的回答,而是一个可能更好的替代数据结构方案

引入一个新表
members
,如下所示

# members
user_id  |  group_id
   1     |     1
   1     |     2
   2     |     2
   3     |     1
   3     |     3
然后您可以
从成员组中逐个组id选择组id,count(*)

+----------+----------+
| group_id | count(*) |
+----------+----------+
|        1 |        2 |
|        2 |        2 |
|        3 |        1 |
+----------+----------+

这种结构也可能使您更容易管理您的会员资格。用户id+组id应该是唯一的。如果支持,请将它们设置为外键。

我建议您创建第三个表,其中包含关于哪些用户属于哪些组的信息

CREATE TABLE users_in_groups 
(
   user_id INT
 , group_id INT
);
然后您可以像这样加入:

SELECT 
   gt.group_id
 , count(ut.user_id)
FROM
   user_table AS ut
 , INNER JOIN users_in_groups AS uig ON uig.user_id = ut.user_id
 , INNER JOIN group_table AS gt ON gt.group_id = uig.group_id
GROUP BY
   gt.group_id
;
要使用您现在拥有的表,您必须执行以下操作(在mysql中):


请记住,在使用“分组方式”时,请始终找到使您的组具有唯一性的内容

您需要规范化,并且永远不要存储逗号分隔的数据。 考虑下面的

mysql> select * from user_table ;
+---------+---------------+
| user_id | user_group_id |
+---------+---------------+
|       1 | 1,2           |
|       2 | 2             |
|       3 | 1,3           |
+---------+---------------+
3 rows in set (0.00 sec)

mysql> select * from group_table ;
+----------+------------+
| group_id | group_name |
+----------+------------+
|        1 | a          |
|        2 | b          |
|        3 | c          |
+----------+------------+
3 rows in set (0.00 sec)
上面的数据不是标准化的,为了从中获得所需的结果,您需要在高效查询中使用一些

select 
g.group_id,
count(*) as  total 
from group_table g 
left join user_table u on find_in_set(g.group_id,u.user_group_id) > 0 
group by g.group_id ;

+----------+-------+
| group_id | total |
+----------+-------+
|        1 |     2 |
|        2 |     2 |
|        3 |     1 |
+----------+-------+
现在让我们进行规范化,并将用户组数据存储在另一个表中,如下所示:

mysql> select * from user_to_group ;
+---------+----------+
| user_id | group_id |
+---------+----------+
|       1 |        1 |
|       1 |        2 |
|       2 |        2 |
|       3 |        1 |
|       3 |        3 |
+---------+----------+
现在,您可以轻松地从这些表编写不同的查询,下面是一些示例

select group_id,count(*) as  tot from user_to_group group by group_id ;

+----------+-----+
| group_id | tot |
+----------+-----+
|        1 |   2 |
|        2 |   2 |
|        3 |   1 |
+----------+-----+
加入谈判桌会更容易

select 
g.group_id,
g.group_name,
count(*) as  tot 
from user_to_group ug 
join group_table g on g.group_id = ug.group_id 
join user_table u on u.user_id = ug.user_id 
group by g.group_id

+----------+------------+-----+
| group_id | group_name | tot |
+----------+------------+-----+
|        1 | a          |   2 |
|        2 | b          |   2 |
|        3 | c          |   1 |
+----------+------------+-----+

如果可以,您应该将CSV值col
user\u group\u id
更改为一个额外的表,其中有两个col:
user\u id
group\u id
。然后,您可以使用外键,并通过简单的
count(*)
查询轻松找到所需内容,而无需执行与字符串相关的操作。谢谢您的解决方案,但我无法更改它。你知道,我不是老板:(我不确定这是否会让你得到错误的结果,例如,当有ID为
1
11
的组时,因为如果你搜索
如%1%
,它将返回1和11的两个结果。你明白我的意思吗?@bish 56确实会引起问题。但是按照hey设计hsi表的方式,它不能更改。对于更好的表格设置Abhik Chakraborty提供了一个很好的答案。我认为这不是一个好的id。例如,当我还有两个:组id=10和11。这意味着用户组id像%1%,你不能在用户id=1、10或10上搜索它11@yanndinh然后,您应该阅读其他答案,并考虑更改数据库结构_我知道你的方式,你不能得到更好的解决方案。谢谢@docratie,我也想改变它。但是我不能,因为我的老板需要改变。所以我必须找到另一个解决方案。
select 
g.group_id,
g.group_name,
count(*) as  tot 
from user_to_group ug 
join group_table g on g.group_id = ug.group_id 
join user_table u on u.user_id = ug.user_id 
group by g.group_id

+----------+------------+-----+
| group_id | group_name | tot |
+----------+------------+-----+
|        1 | a          |   2 |
|        2 | b          |   2 |
|        3 | c          |   1 |
+----------+------------+-----+