ManyToMany查询问题

时间:2011-04-19 18:37:12

标签: mysql sql django

我有三个简单的表:ManyToMany基础上的组,权限和group_permissions。 我的问题在于执行一个查询,给定组ID(pk),将使用所有权限检索结果集,包括与给定组关联的权限以及与组无关联的权限。

我尝试过类似的事情:

SELECT * 
FROM permission
LEFT JOIN group_permissions ON group_permissions.permission_id = permission.id  
LEFT JOIN group ON group_permissions.group_id = group.id
WHERE group.id = 123

但它不起作用......

任何sugestions?

谢谢大家的回答,我刚刚在不到30分钟内解决了我的问题!这不是吗?

SELECT * 
FROM auth_permission
LEFT JOIN auth_group_permissions ON auth_group_permissions.permission_id = auth_permission.id AND auth_group_permissions.group_id = 123    
LEFT JOIN auth_group ON auth_group.id = auth_group_permissions.group_id 

2 个答案:

答案 0 :(得分:4)

如各种注释中所述,您无法在WHERE子句中测试group.id的值,因为它将取消LEFT JOIN并强制它像INNER JOIN一样运行。

相反,将该测试作为JOIN条件的一部分:

SELECT * 
    FROM permission
        LEFT JOIN group_permissions 
            ON group_permissions.permission_id = permission.id  
        LEFT JOIN `group` 
            ON group_permissions.group_id = `group`.id
                AND `group`.id = 123

答案 1 :(得分:2)

group是SQL中的关键字。使用关键字命名的表或字段通常不是一个好主意,但如果必须,则必须将它们包含在通常位于键盘左上角的反引号字符中,位于转义键下:

SELECT * 
FROM permission
LEFT JOIN group_permissions ON group_permissions.permission_id = permission.id  
LEFT JOIN `group` ON group_permissions.group_id = `group`.id

用于指定的组ID是什么?如果您没有使用它进行过滤,那么需要为它指定什么?