Mysql 在单个查询中与第二个表联接时从表中获取所有项
我有两张桌子:Mysql 在单个查询中与第二个表联接时从表中获取所有项,mysql,Mysql,我有两张桌子: CREATE TABLE IF NOT EXISTS `groups2rights` ( `groups2rights_group_id` int(11) NOT NULL default '0', `groups2rights_right` int(11) NOT NULL default '0', PRIMARY KEY (`groups2rights_group_id`,`groups2rights_right`), KEY `groups2rights_
CREATE TABLE IF NOT EXISTS `groups2rights` (
`groups2rights_group_id` int(11) NOT NULL default '0',
`groups2rights_right` int(11) NOT NULL default '0',
PRIMARY KEY (`groups2rights_group_id`,`groups2rights_right`),
KEY `groups2rights_right` (`groups2rights_right`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `groups2rights` (`groups2rights_group_id`, `groups2rights_right`) VALUES (1, 35);
CREATE TABLE IF NOT EXISTS `rights` (
`right` int(11) NOT NULL auto_increment,
`right_name` varchar(255) default NULL,
`description` text NOT NULL,
`category` int(11) NOT NULL default '0',
PRIMARY KEY (`right`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=36 ;
INSERT INTO `rights` (`right`, `right_name`, `description`, `category`) VALUES
(33, 'admin_right_group_add', '', 100),
(34, 'admin_right_group_edit', '', 0),
(35, 'admin_right_group_delete', '', 0);
ALTER TABLE `groups2rights` ADD CONSTRAINT `groups2rights_ibfk_4` FOREIGN KEY (`groups2rights_right`) REFERENCES `rights` (`right`) ON DELETE CASCADE;
现在,我尝试选择所有可用的权限
,并获取该组是否分配了权限,但不知何故,我丢失了一些权限。查询:
SELECT r.*,g2r.groups2rights_group_id
FROM rights AS r
LEFT JOIN groups2rights AS g2r ON (g2r.groups2rights_right=r.right)
WHERE g2r.groups2rights_group_id=<<ID>> OR g2r.groups2rights_group_id IS NULL
ORDER BY r.category,r.right_name ASC
选择r.*,g2r.groups2rights\u group\u id
从作为r的权利
以g2r ON(g2r.groups2rights\u right=r.right)的形式左加入组2权限
其中g2r.groups2rights\u group\u id=或g2r.groups2rights\u group\u id为空
按r.category、r.right\u name ASC排序
有什么想法吗
编辑:
更新了代码
预期结果为3行,其中2行为空字段,另一行为值集。是否要返回在正确表中找到的所有结果?在这种情况下,应该使用右连接。这将返回右表中的所有结果,而不管它是否与左表匹配
那么您想返回在正确表中找到的所有结果吗?在这种情况下,应该使用右连接。这将返回右表中的所有结果,而不管它是否与左表匹配 如果你这样做
SELECT r.*,g2r.group_id
FROM rights AS r
LEFT JOIN groups2rights AS g2r ON (g2r.right=r.right)
WHERE g2r.group_id=<<#id>> OR g2r.group_id IS NULL
ORDER BY r.category,r.right_name ASC
这应该行得通。如果行的话
SELECT r.*,g2r.group_id
FROM rights AS r
LEFT JOIN groups2rights AS g2r ON (g2r.right=r.right)
WHERE g2r.group_id=<<#id>> OR g2r.group_id IS NULL
ORDER BY r.category,r.right_name ASC
这应该是可行的。在查询中没有什么不正确的地方-您可以发布具有预期/实际结果的样本数据吗?在查询中没有什么不正确的地方-您可以发布具有预期/实际结果的样本数据吗?不,他的表称为“权限”。我也困惑了一会儿;)这就是我在工作时略读一个问题所得到的,哈哈。看起来答案已经给出了,所以我想没有伤害没有犯规。不,他的桌子叫“权利”。我也困惑了一会儿;)这就是我在工作时略读一个问题所得到的,哈哈。看起来答案已经给出了,所以我想没有伤害没有犯规。谢谢,我想我必须使用一个辅助选择,只是不知道在哪里以及如何。。。谢谢!接球不错,约翰,不知什么原因,那球正好越过了我的头顶。一定已经需要一只红牛了…谢谢,我想我必须使用一个子选择只是不知道在哪里和如何。。。谢谢!接球不错,约翰,不知什么原因,那球正好越过了我的头顶。一定已经需要一只红牛了。。。