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

时间:2015-06-02 07:57:40

标签: php mysql

我在数据库中有2个表:

http://i.stack.imgur.com/nRJFf.png

如何获得每个组的总用户数。即:组1:总共2个用户; group2:总共有2个用户; group3:total是1个用户

4 个答案:

答案 0 :(得分:2)

您需要规范化,绝不存储以逗号分隔的数据。 请考虑以下

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 |
+----------+------------+-----+

答案 1 :(得分:0)

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;

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

答案 2 :(得分:0)

这不是您具体问题的答案,而是可能更好的替代数据结构提案。

引入一个类似于

的新表members
# members
user_id  |  group_id
   1     |     1
   1     |     2
   2     |     2
   3     |     1
   3     |     3

然后你可以SELECT group_id, count(*) FROM members GROUP BY group_id

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

此结构还可以让您更轻松地管理您的会员资格。 user_id + group_id应该是唯一的。如果支持,让它们成为外键。

答案 3 :(得分:0)

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

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中):

SELECT
       gt.group_id
     , count(ut.user_id)
FROM
   user_table AS ut
 , INNER JOIN group_table AS gt ON LOCATE(gt.group_id, ut.user_group_id) > 0
GROUP BY
   gt.group_id

请记住,在使用分组依据时,请始终找到使您的群组与众不同的内容!