2011-04-19 148 views
2

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

我已经试过类似:

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 

,但它只是不工作...

任何建议吗?

谢谢大家的回答,我只用了不到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 
+0

这是完整的查询?你提到的给定组ID的测试在哪里? – 2011-04-19 18:42:03

+0

我忘了:(刚刚编辑it.tk – Abel 2011-04-19 18:56:33

+0

这就是我所怀疑的,这就是为什么我问这个问题的原因。正如我在下面对Steve Mayne的评论中所提到的那样,您无法在where子句中检查该值,因为它会取消左连接。我已经发布了一个解决这个问题的答案 – 2011-04-19 18:59:28

回答

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用于指定?如果您没有使用它进行过滤,那么需要指定什么?

+0

但是你不想在WHERE子句中检查group.id = 123,这将否定LEFT JOIN并强制它像INNER JOIN一样行为 – 2011-04-19 18:47:24

+0

这是真的 - 说实话,说它“检索所有权限”有点令人困惑 - 所以指定了什么? – 2011-04-19 18:49:11

+0

我想检索所有权限(就像SELECT * FROM权限一样),但是区分给定的权限组和其他人没有使用 – Abel 2011-04-19 18:50:59

4

正如各种注释中所提到的,您无法在WHERE子句中测试group.id的值,因为它会取消LEFT JOIN并强制它像INNER 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 
+0

你已经提出了一个很好的观点,现在左连接没有被否定。尽管如此,我得到重复的项目(例如,与其他组相关的权限) 我已经设法解决这个问题: SELECT * FROM permission LEFT JOIN group_permissions ON group_permissions.permission_id = permission.id AND group_permissions .group_id = 123 LEFT JOIN group ON group_permissions.group_id = group.id 谢谢 – Abel 2011-04-19 19:26:46

+0

抱歉格式化,只能看到如何在这里编码:) – Abel 2011-04-19 19:28:36