2011-08-29 43 views
1

我遇到了一些与我正在开发的简单ACL模块存在多对多关系的问题。加入MySQL和PHP的别名

我有三个表:

  • * id_group

权限

  • * id_permission

RelPermissionsGroup

  • * id_relation
  • 许可

所以我有这个查询

SELECT * FROM acl_groups 
LEFT OUTER JOIN acl_RelPermissionsGroup 
    ON acl_groups.id_group = acl_RelPermissionsGroup.group 
LEFT OUTER JOIN acl_permissions 
    ON acl_permissions.id_permission = acl_RelPermissionsGroup.permission 
WHERE id_group > 0 

如果我在phpmyadmin中查询它显示罚款。因此,它显示了所有组是否拥有权限,如果他们拥有权限,也会显示它们。

我在这里看到一个问题,它是名称属性重复。我怎样才能混淆每一个领域? 但这不是问题。

问题是,除了没有任何权限的组以外,执行mysqli_fetch_assoc会执行正常。这是什么输出:

Array ( 
[id_group] => 2 
[name] => 
[id_relation] => 
[group] => 
[permission] => 
[id_permission] => 
) 

组ID是好的,但考虑到字段重复它覆盖它们的事实。此外,id_group和id_permission似乎分别与组和权限重复。

我该怎么办?

回答

1

你必须明确命名的领域,像这样

SELECT 
    ag.name as group_name 
    ,ap.name as permission_name 
    ,ar.`group` as permission_group_id 
FROM acl_groups ag 
LEFT OUTER JOIN acl_RelPermissionsGroup ar ON ag.id_group = ar.`group` 
LEFT OUTER JOIN acl_permissions ap ON ap.id_permission = ar.permission 
WHERE id_group > 0 

不要忘了, group是一个保留字,需要用引号`group`来引用。

+0

它的工作原理!我可以选择显示多少个字段。感谢:D –

1

你应该写 'SELECT groups.id_group GROUP_ID,groups.name为GROUP_NAME ......'