2016-05-03 21 views
0

私のサイトのメニューを駆動するmysqlテーブルがあります。メニュー項目を表示できるユーザーの役割を定義する各メニュー項目の列があります。MySQL複数の値をカンマ区切りリストで検索する

私は、私は、ユーザーがであることを役割のリストを提供し、それらが許可されているメニュー項目を見つけることができますクエリを構築しようとしていますカンマ区切りリスト

として「許可」ロールを格納表示する。 LIKE %ROLE1% %ROLE2%などを使ってみましたが、これらのすべての役割にあるメニュー項目だけが返されます。

ユーザーの役割と対応するメニュー項目を検索するにはどうすればよいですか。

+4

複数の値を1つの列に保存しないでください!!あなたが今見ているように、これはあなたを困らせるだけです。 –

答えて

0

あなたのデータベースには、normalizationが必要であり、より具体的には、First Normal Formと考える必要があります。ブリッジテーブルとしてROLEMENU_ITEMの間で使用されるMENU_ITEM_ROLEテーブルを作成する必要があります。これは、MENU_ITEMエンティティの主キーとそれにアクセスするために必要なそれぞれのROLEを持つ複数のレコードを保持します。

しかし、状況を考えれば、あなたは試してみたとおっしゃいました: LIKE %ROLE1% %ROLE2% e.t.cすべてのロールで使用可能なメニュー項目のみを返しました。私はおそらくあなたが異なるLIKE式の間でAND演算子を使用したためと考えています。この場合、適切な演算子はORであり、少なくとも1つのロールがあるメニュー項目だけが取得されます。

この解決策と文字列操作でこの問題を解決しようとすると、ロール名に類似した値がある場合にはさらに問題が発生します。例えば。役割'ROLE_ADMIN'で利用可能なメニュー項目を有し、そして役割'ROLE_ADMIN_USERS'上で利用可能な別のメニュー項目B、次いで役割'ROLE_ADMIN'を有するユーザが、所与の、最も信頼性の高いソリューションメニュー項目A及びB

の両方を見ることができます状況は、MENU_ITEMテーブルのロールフィールドをトークン化する関数を使用して一致を検索することです。 この方向では、私はFIND_IN_SETのようなものを使用します。

など。

select * from menu_item where find_in_set('ROLE1', roles)>0 

参考文献here

関連する問題