在单个查询中加入第二个表时,从表中获取所有项目

时间:2011-08-25 13:34:32

标签: 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_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;

现在我尝试选择所有可用的Rights,并且如果该组已经分配了它,也会得到,但不知怎的,我错过了一些权利。查询:

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

有什么想法吗?

编辑: 更新了代码。

预期结果为3行,其中2行Havin为Null字段,1为具有值集。

2 个答案:

答案 0 :(得分:1)

如果你这样做

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

你不会获得g2r.group_id&lt;&gt;的行null和g2r.group_id&lt;&gt; &LT;&LT;#标识&GT;&GT;

如果您想要rights中的所有行以及groups2rights中的某些行,您应该这样做:

SELECT r.*,g2r.group_id
FROM rights AS r
LEFT JOIN (SELECT * FROM groups2rights WHERE group_id=<<#id>>) AS g2r 
ON (g2r.right=r.right) 
ORDER BY r.category,r.right_name ASC

这应该有用。

答案 1 :(得分:0)

所以你想要返回在右表中找到的所有结果?在这种情况下,您应该使用RIGHT JOIN。这将返回右表中的所有结果,无论它与左表匹配。

http://www.w3schools.com/sql/sql_join_right.asp