【发布时间】:2014-08-20 06:43:38
【问题描述】:
我有两个 MySql 表如下:
resource
-----------------------------------------------
id name group owner_id
-----------------------------------------------
1 MyResource1 hs 11
2 MyResource2 ms 24
3 MyResource3 ps 11
...
resource_access
-----------------------------------------------
id resource_id user_id
-----------------------------------------------
1 1 12
2 2 24
3 2 11
4 3 15
...
现在,第一个表当然是资源列表,以及owner_id 列中的各自所有者。第二个表是与另一个用户“共享”该资源的结果。表resource_access可能包含带有user_id 的记录,这与owner_id 在resource_access 的一行中的owner_id 相同,这是来自所有者交换的混乱清理的结果。
我只想获取用户有权访问的任何资源的 ID、名称和组,无论他们是所有者还是已与他们共享。这是我对示例用户 (24) 的 MySQL 查询:
SELECT resource.id, resource.name, resource.group
FROM `resource`
INNER JOIN resource_access ON (
resource.owner_id='24'
OR (
resource_access.user_id='24' AND
resource_access.resource_id=resource.id
)
)
现在,它会多次返回资源号 2 的 id、name 和 group(例如 12 个)。有没有可能的原因?我已经尝试过 LEFT 和 RIGHT 加入并得到相同的结果。 resource 表中有很多记录,但没有一个与 id 为 2 的记录。resource_access 中没有重复的行与同一用户共享资源两次。
提前致谢。
【问题讨论】:
-
使用
SELECT DISTINCT删除重复项。否则,每个与他们共享的用户都会得到一行,因为JOIN在两个表之间执行了交叉乘积。
标签: php mysql left-join inner-join right-join