我在MySql中遇到子查询问题。我有一个包含用户组的表。列是id,name和具有描述每一行的注释的属性: (Id是INT,Name VARCHAR,所有其他TINYINT(1)(布尔值)
ID | Name | login | post | manage
1 user 1 0 0
2 poster 1 1 0
3 admin 1 1 1
我的目标是能够列出用户组属性(上面的登录,发布和管理)以及具有每个属性的用户组数(分别为3,2和1)。
此查询有效(但显然每次都会计入登录列):
SELECT @colname:=cols.column_name,cols.column_comment,
(SELECT COUNT(*) FROM db.usergroups WHERE login=1) AS num_users
FROM information_schema.columns AS cols
WHERE TABLE_SCHEMA='db' AND TABLE_NAME='usergroups' AND column_type='tinyint(1)';
这不起作用(num_users始终为0)
SELECT @colname:=cols.column_name,cols.column_comment,
(SELECT COUNT(*) FROM db.usergroups WHERE cols.column_name=1) AS num_users
FROM information_schema.columns AS cols
WHERE TABLE_SCHEMA='db' AND TABLE_NAME='usergroups' AND column_type='tinyint(1)';
这两个(num_users总是0)
SELECT @colname:=cols.column_name,cols.column_comment,
(SELECT COUNT(*) FROM db.usergroups WHERE @colname=1) AS num_users
FROM information_schema.columns AS cols
WHERE TABLE_SCHEMA='db' AND TABLE_NAME='usergroups' AND column_type='tinyint(1)';
有什么方法可以让它发挥作用吗?那就是 - 首先评估外部声明?
-
非常感谢您的帮助!
/维克多
答案 0 :(得分:1)
如果我正确理解您的问题,我认为这可能会满足您的需求:
select
sum(login) as Num_Login_Groups,
sum(post) as Num_Post_Groups,
sum(manage) as Num_Manage_Groups
from db.usergroups;
或者,如果您真的需要'登录','发布'和'管理'与具有该权限的组的数量显示在同一行,您可以这样做:
select 'login' as Property, sum(login) as Count from db.usergroups
union
select 'post' as Property, sum(post) as Count from db.usergroups
union
select 'manage' as Property, sum(manage) as Count from db.usergroups;
我假设这些是你的桌子将拥有的唯一三个属性。如果你想为每个用户组提供一组可扩展的权限,我建议将它们存储在一个单独的表中,每个适用的用户权限配对都有一行。
您也可以考虑使用Name
作为表格的主键,因为它更直观,并且可能需要保持唯一。
答案 1 :(得分:0)
这实际上不是使用关系数据库的方法。您可能可能使用预准备语句来执行此操作...
PREPARE stmt FROM 'SELECT COUNT(*) FROM db.usergroups WHERE ' + col_name + '=1';
-- Execute statement etc...
但动态执行此操作的真正方法是将列分隔为行(即,使用另一个名为db.permissiontypes
或其他的表,然后将其与db.usergroups
连接。)