我在数据库中有2个表:
如何获得每个组的总用户数。即:组1:总共2个用户; group2:总共有2个用户; group3:total是1个用户
答案 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
请记住,在使用分组依据时,请始终找到使您的群组与众不同的内容!