2010-12-27 10 views
3

私が持っているもの:ユーザーのWebサイトの権限を格納し、mySQLでクエリを実行する方法は?

私のテーブルには、privilegesというユーザの特権の文字列を格納するカラムがあります。 (-1 =所有者、0 =管理者、1 =中程度のコメントなど)だから私はこのような文字列をSQLに入れます:1,2,3

問題:

私は管理者とモデレータであるすべてのユーザーを選択したい場合は、それがLIKE条件で少しトリッキーになります。今、私は管理者が必要な場合は、すべてのユーザーが1を検索するだけです(PHPを使用して非効率的です)。

私は、プラグイン開発者が簡単に「プラグイン」して簡単にクエリを実行できるソリューションを探しています。私のソリューションはうまくいきますが、ユーザーが何百人もの人に成長すると、一定の特権を見つけるために、繰り返しこれらのすべてを繰り返し実行する必要があります。

誰にでも良い方法や考えがありますか?

+0

あなたは、リレーショナルデータベース[ユーザ] - [ - ロール]を使用する必要があります...あなたはPHPでループすると効率が悪いと言っていますが、LIKEについてはどうですか?あなたが望むものを実現するには、LIKEクエリの始めにワイルドカードを使用する必要があります。最悪のやり方です。 ACLを見てください。 – Alex

+0

@Alex - 私は間違いなくmySQLの初心者ですが、データの転送は「LIKE」を使用した低速クエリよりも効率的ではありません。 – Jason

+0

現在のテーブル構造に基づいてビューを作成できます。このビューでは、すべてのユーザタイプを分割し、複数のクエリを「UNION」と組み合わせることができます。次に、特定のタイプのビューを照会します(例: 'WHERE type = 1')。クエリが遅いがデータ転送量は最小です。 – Alex

答えて

1
SELECT * 
FROM privileges 
WHERE FIND_IN_SET(0, privilege) 
     AND FIND_IN_SET(1, privilege) 

を作るようにそのような単純なユーザーを探していることは(追加のテーブルを作成し、used_idとpriviledge_idを関連する多くのUserPriviledgeテーブルに多くを追加user_privilegesには特権ごとに別々のレコードがあります)。この方法で実行することができます:

SELECT user 
FROM user_privileges 
WHERE privilege IN (0, 1) 
GROUP BY 
     user 
HAVING COUNT(*) = 2 

これはprivilegeのインデックスを使用できます。

また、固有のSETデータ型で特権を格納することを検討することもできます。

+0

特権フラグが9より大きいとどうなりますか? 'FIND_IN_SET(1、特権)'は '2,3,10'を持っていれば何かを返すでしょうか? – Jason

+0

@ジェイソン:いいえ、それはできません。 'SELECT FIND_IN_SET(1、 '2,3,10')' – Quassnoi

+0

を実行するだけで、別のテーブルを追加しなくてもいいと思っていました。しかし、私は他の優雅な解決策を持っていないようです。簡単な質問は、私はユーザーデータベースを照会したと言う、行を返す前に、別の列にすべての特権を追加する方法は?それは理にかなっていますか? – Jason

3

なぜあなたはIDと名前を保持するPriviledgeのようなテーブルを使いませんか?そして、そう、あなたはあなたのテーブルを正規化する場合は、より高速なクエリを持つことになりますINNER_JOIN

1

あなたのテーブルは、guimanが提案するように正規化する必要があります。 Wikipedia:正規化されたテーブルは、汎用のクエリに適しています。つまり、これらのテーブルに対するクエリ(詳細が予期できない将来のクエリを含む)がサポートされます。対照的に、正規化されていない表は、いくつかのタイプの問合せに役立ちますが、他の問合せには使用できません。

関連する問題