代码之家  ›  专栏  ›  技术社区  ›  Victor

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

  •  1
  • Victor  · 技术社区  · 16 年前

    (Id为INT,名称为VARCHAR,所有其他TINYINT(1)(即布尔值)

    ID   |   Name   |   login   |   post   |   manage
     1     user           1           0           0
     2     poster         1           1           0
     3     admin          1           1           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 回复  |  直到 16 年前
        1
  •  1
  •   cheduardo    16 年前

    如果我正确地理解了您的问题,我认为这可以满足您的需要:

    select
      sum(login) as Num_Login_Groups,
      sum(post) as Num_Post_Groups,
      sum(manage) as Num_Manage_Groups
    from db.usergroups;
    

    或者,如果您确实需要“login”、“post”和“manage”与具有该权限的组的数量显示在同一行,则可以执行以下操作:

    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 作为表的主键,因为它更直观,而且可能需要唯一性。

        2
  •  0
  •   Blixt    16 年前

    这不是使用关系数据库的方法。你呢 可能是用事先准备好的陈述。。。

    PREPARE stmt FROM 'SELECT COUNT(*) FROM db.usergroups WHERE ' + col_name + '=1';
    -- Execute statement etc...
    

    但是,动态执行此操作的真正方法是将列分隔成行(即调用另一个表 db.permissiontypes 或者其他什么,然后加入进来 db.usergroups