MySql中的相关子查询 - 如何首先评估外部查询?

时间:2009-06-11 11:57:49

标签: mysql select subquery

我在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)';

有什么方法可以让它发挥作用吗?那就是 - 首先评估外部声明?

-

非常感谢您的帮助!

/维克多

2 个答案:

答案 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连接。)