如何通过PHP从数据库中获取组中的总用户数
我在数据库中有两个表: 如何获取每个组的总用户数。i、 e:第1组:共有2名用户; 第2组:共有2个用户; 组3:总共是1个用户如何通过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; 这应该有效,并为您提供所有组的列表以及其中有多少用户。这不是对您特定问题的回答,而是一个可能更好的替代数据结构方案 引
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 |
+----------+------------+-----+