MySQL使用逗号分隔列表

时间:2016-05-03 10:41:52

标签: mysql

我有一个mysql表来驱动我网站上的菜单。我为每个菜单项都有一个列,用于定义哪些用户角色可以查看菜单项。

我存储"授权"角色作为逗号分隔列表

我正在尝试构建一个查询,允许我提供用户所在的角色列表,并找到允许他们查看的菜单项。我尝试使用LIKE %ROLE1% %ROLE2%等等......但这只会返回所有这些角色中的菜单项。

如何找到用户的角色和相应的菜单项?

1 个答案:

答案 0 :(得分:0)

我同意每个人都会告诉你,你的数据库需要normalization,更具体地说,要考虑First Normal Form。您应该创建一个MENU_ITEM_ROLE表,该表将用作ROLEMENU_ITEM之间的桥接表。它将使用MENU_ITEM实体的主键以及访问它所需的相应ROLE来保存多个记录。

但是,考虑到你的情况,你说你试过: LIKE %ROLE1% %ROLE2% e.t.c.它只返回所有角色可用的菜单项。我假设这可能是因为您在不同的LIKE表达式之间使用了AND运算符。在这种情况下,我想说的合适的运算符是OR,并且只检索具有至少一个OR ed角色的菜单项。

您应该考虑这个解决方案并尝试使用字符串操作来解决此问题,如果您的角色名称具有相似的值,则会导致更多麻烦。例如。在角色'ROLE_ADMIN'上有一个菜单项A,在角色'ROLE_ADMIN_USERS'上有另一个菜单项B,那么具有角色'ROLE_ADMIN'的用户将能够看到菜单项A和B

考虑到这种情况,最可靠的解决方案是使用标记MENU_ITEM表的角色字段的函数,然后搜索匹配项。 在这个方向上,我会使用像FIND_IN_SET这样的东西。

E.g。

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

也参考here