我试图为Spring Security定义权限用户名查询:
SELECT u.username, r.authrole FROM users u, roles r, user_role ur
WHERE u.id = ur.userid AND u.username = 'dit'
令人尴尬,但这个查询返回错误的结果,我无法修复它。
结果:
username authrole
-----------------------
dit ROLE_ADMIN
dit ROLE_USER
这是我的表格:
用户:
id username password
---------------------------------
1 admin *****
2 dit *****
USER_ROLE:
userid roleid
---------------------
1 1
2 2
作用:
id authrole
---------------------
1 ROLE_ADMIN
2 ROLE_USER
更新:我从这个example on github
中接受了这个错误的查询答案 0 :(得分:3)
使用此(注意:INNER关键字是可选的):
SELECT u.username
,r.authrole
FROM users u
INNER JOIN user_role ur
ON u.id = ur.userid
INNER JOIN roles r
ON r.id = ur.roleid
WHERE u.username = 'dit'
问题在于你正在加入角色表而没有给出如何加入表格的任何条件。结果将是一个笛卡尔积,其中显示了所连接表之间的所有可能组合。
然后加入WHERE子句,使用JOIN语法会更好(更清楚)。此外,更重要的是,使用JOIN语法会创建关注点分离。将您正在使用的字段加入where子句中的表可能会导致难以理解查询。
基本上有四种不同的连接:
INNER JOIN:当BOTH表中至少有一个匹配时返回所有行
LEFT JOIN:返回左表中的所有行,以及右表中匹配的行
RIGHT JOIN:返回右表中的所有行,以及左表中匹配的行
FULL JOIN:当其中一个表中有匹配时返回所有行