根据用户角色

时间:2018-03-05 15:36:59

标签: mysql sql

我想找到一个用户基于角色的所有房屋,因为角色值以逗号分隔的数字我使用了FIND_IN_SET并写了一个如下所示的mysql查询,但它显示错误的结果

SELECT Name FROM Houses WHERE FIND_IN_SET(Roles, (SELECT r.Roles FROM Roles r WHERE users = 'Manu'))

enter image description here

我基于用户的预期结果如下所示

enter image description here

任何人都可以帮助我

1 个答案:

答案 0 :(得分:1)

规范化您的模式,以便每行都有一个单独的行。

House_roles

House_name  Role
r_house_1   1
r_house_1   2
r_house_1   3
r_house_2   2
r_house_2   3
r_house_3   1
r_house_3   3
r_house_4   1
r_house_4   2

User_roles

User_name   Role
Manu        1
John        1
John        2
Sunny       3
Jack        1
Jack        2

然后查询是这两个表之间的连接:

SELECT House_name
FROM House_roles AS h
JOIN User_roles AS u ON h.role = u.role
WHERE u.User_name = 'Manu'

如果无法更改架构,请参阅SQL split values to multiple rows了解如何编写查询以将逗号分隔的列表拆分为行。如果房屋或用户最多可以拥有100个角色,请在名为numbers的列中创建一个包含1到100之间数字的表n。然后,您可以通过将表与numbers表连接来创建这样的临时表。以下是创建House_roles的查询:

CREATE TEMPORARY TABLE House_roles (
    House_name VARCHAR(32),
    Role INT,
    INDEX(Role)
) AS
SELECT h.name, SUBSTRING_INDEX(SUBSTRING_INDEX(h.role, ',', n.n), ',', -1)
FROM House AS h
JOIN numbers AS n ON CHAR_LENGTH(h.role)
 -CHAR_LENGTH(REPLACE(h.role, ',', ''))>=n.n-1

User_roles类似。