MySQL JOIN上有三个表,包括一个WHERE?

时间:2014-06-13 11:49:35

标签: mysql join

我有三个这样的结构表:

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中实现此结果。但这是一个乏味的循环,我相信它可以被优化为只有一个查询来给我这些信息。

非常感谢任何建议。

4 个答案:

答案 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。

希望这对以后的人有用!