我想找到一个用户基于角色的所有房屋,因为角色值以逗号分隔的数字我使用了FIND_IN_SET并写了一个如下所示的mysql查询,但它显示错误的结果
SELECT Name FROM Houses WHERE FIND_IN_SET(Roles, (SELECT r.Roles FROM Roles r WHERE users = 'Manu'))
我基于用户的预期结果如下所示
任何人都可以帮助我
答案 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
类似。