我有三个这样的结构表:
usergroups:
id
title
field:
id
title
field_permissions:
id
field_id
group_id
这些表的目的是将多个组分配给一个字段(以便应用程序中的多个人可以访问它)。用户组被授予通过field_permissions表访问特定字段的权限。
我需要做的是(使用mysql)获取所有用户组的列表以及一个列,指示他们是否有权访问字段(否则为NULL)。 (我希望这是有道理的)。这是我到目前为止所做的一个例子。
使用此查询:
SELECT usergroups.id AS group_id, usergroups.title AS usergroup, field_permissions.id AS permission_id
FROM usergroups
LEFT JOIN field_permissions ON field_permissions.group_id=usergroups.id
LEFT JOIN field ON field.id=field_permissions.field_id
WHERE field.id=1
我得到以下结果:
group_id usergroup permission_id
=======================================
1 Super User 10
2 Basic User 11
3 Administrator 12
这为我提供了对该特定字段具有权限的用户组(相关字段的id为1)。我知道他们对该领域的许可只是因为存在与这两者相关的许可ID。
我正在寻找的是:
group_id usergroup permission
====================================
1 Super User 10
2 Basic User 11
3 Administrator 12
4 Public User NULL
显示group_id 4没有此字段的权限。
目前,我通过获取所有存在的用户组,然后使用foreach循环查找与field_permissions表中的字段相关的每个用户组,在PHP中实现此结果。但这是一个乏味的循环,我相信它可以被优化为只有一个查询来给我这些信息。
非常感谢任何建议。
答案 0 :(得分:3)
left outer join
保留第一个表中的所有行。如果没有匹配项,则会生成NULL
值。您的where
正在撤消外部联接。您可以通过将条件移动到on
子句中来解决此问题:
SELECT usergroups.id AS group_id, usergroups.title AS usergroup,
field_permissions.id AS permission_id
FROM usergroups LEFT JOIN
field_permissions
ON field_permissions.group_id = usergroups.id LEFT JOIN
field
ON field.id = field_permissions.field_id AND
field.id = 1;
答案 1 :(得分:1)
尝试这绝对有效。
SELECT fp.id as field_permissions_id,f.id AS field_id,f.title,ug.id AS usergroup_id,ug.title FROM field_permissions AS fp LEFT JOIN field AS f ON fp.field_id = f.id LEFT JOIN usergroups AS ug ON fp.group_id = ug.id WHERE fp.field_id = f.id AND fp.group_id = ug.id
答案 2 :(得分:0)
要获得预期结果,您应该使用field_permissions
中的WHERE
,而不是field
。
原因是,如果field
为NULL,则此秒数不会进入结果。
您还可以在以下位置添加其他条件:
WHERE field.id = 1 OR field.id IS NULL
答案 3 :(得分:0)
感谢戈登,你的回答没有完美的第一次拍摄,但这是一个好的开始! 使用您的答案与表中所有121个field_permissions行及其分配的用户组完全一致,这不是我需要的(我之前尝试过这个)。 然而,这有效:
SELECT usergroups.id AS group_id, usergroups.title AS usergroup,
field_permissions.id AS permission_id
FROM usergroups
LEFT JOIN field_permissions ON field_permissions.group_id = usergroups.id AND field_permissions.field_id=3
LEFT JOIN field ON field.id = field_permissions.field_id AND field.id = 3;
这给了我这个:
group_id usergroup permission
====================================
1 Super User 10
2 Basic User 11
3 Administrator 12
4 Public User NULL
注意我是如何将AND语句添加到最后一个LEFT JOIN而另一个添加到第一个LEFT JOIN。
希望这对以后的人有用!