1

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

これを機能させる方法はありますか?つまり、最初に外側のステートメントを評価するのですか?

-

助けてくれてありがとう!

/ビクター

4

2 に答える 2

1

あなたの問題を正しく理解していれば、これであなたが必要とすることができると思います:

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;

テーブルが持つプロパティはこれら 3 つだけだと思います。ユーザー グループごとに拡張可能な一連の権限が必要な場合は、該当するユーザーと権限の組み合わせごとに 1 行ずつ、別のテーブルにそれらを格納することをお勧めします。

Nameまた、テーブルの主キーとして使用することを検討することもできます。これは、より直感的であり、おそらく一意である必要があるためです。

于 2009-06-11T12:35:16.230 に答える
0

これは、リレーショナル データベースを実際に使用する方法ではありません。おそらく、準備されたステートメントを使用してそれを行うことができます...

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

しかし、これを動的に行う実際の方法は、列を行に分割することです (つまり、またはその他の名前の別のテーブルをdb.permissiontypes作成し、それを で結合しdb.usergroupsます)。

于 2009-06-11T12:39:43.193 に答える