作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下数据库表:
user
int unsigned id
varchar login
group
int unsigned id
varchar label
right
int unsigned id
varchar label
user_group
int unsigned userId
int unsigned groupId
user_right
int unsigned userId
int unsigned rightId
group_right
int unsigned groupId
int unsigned rightId
当使用 user_right 或 group_right 表(分别)关联时,权限被视为授予组或用户。我有以下查询应该从他的登录中检索用户的权限:
SELECT DISTINCT `R`.`id`,
`R`.`label`
FROM `user` `U`,
`right` `R`,
`user_right` `UR`,
`user_group` `UG`,
`group_right` `GR`
WHERE (`U`.`id` = `UR`.`userId`
AND `R`.`id` = `UR`.`rightId`
OR `U`.`id` = `UG`.`userId`
AND `UG`.`groupId` = `GR`.`groupId`
AND `R`.`id` = `GR`.`rightId`)
AND `U`.`login` = 'admin'
当用户与权限和组相关联时,查询会起作用并返回正确的权限。但是当用户没有组时,查询不起作用。如果我删除未使用的表(user_group 和 group_rights),它会再次工作。
我应该在我的查询中添加什么来避免这种情况?我应该添加类似“OR some_column IS NULL”的内容吗?如果您也能向我解释原因,我将不胜感激,这样我就不会再遇到这个问题了。
提前致谢。
一些示例数据:
user (id, login)
1 'admin'
right (id, label)
1 'r1',
2 'r2',
3 'r3'
user_right (id, label)
1 1
感谢阅读:)
最佳答案
首先,您使用的是隐式联接,并且按照您编写查询的方式,它们是 INNER JOIN
。您应该更改查询以使用适当的显式连接,并在其中使用 LEFT JOIN
。像这样:
SELECT DISTINCT `R`.`id`,
`R`.`label`
FROM `user` `U`
LEFT JOIN `user_right` `UR`
ON `U`.`id` = `UR`.`userId`
LEFT JOIN `right` `R`
ON `R`.`id` = `UR`.`rightId`
LEFT JOIN `user_group` `UG`
ON `U`.`id` = `UG`.`userId`
LEFT JOIN `group_right` `GR`
ON `UG`.`groupId` = `GR`.`groupId` AND `R`.`id` = `GR`.`rightId`
WHERE `U`.`login` = 'admin'
关于mysql - FROM 崩溃查询中未使用的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13380085/
我是一名优秀的程序员,十分优秀!