MySQL内部联接返回同一行的倍数

Nat*_*han 3 php mysql inner-join left-join right-join

我有两个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
...
Run Code Online (Sandbox Code Playgroud)

现在,第一个表是资源列表,当然还有owner_id列中的各自所有者.第二个表是与另一个用户"共享"此资源的结果.该表resource_access 可能包含一个记录,其中的记录user_id等同于所有者交换中清理清理owner_id的行中的记录resource_access.

我只想获取用户有权访问的任何资源的ID,名称和组,无论他们是所有者还是已经与他们共享.这是我对示例用户的MySQL查询(24):

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
    )
)
Run Code Online (Sandbox Code Playgroud)

眼下,它返回id,name以及group资源2号多次(如十二)个.有可能的原因吗?我尝试过LEFTRIGHT加入并得到了相同的结果.表中有许多记录resource,但没有记录id为2.在resource_access与同一用户共享资源两次时,没有重复的行.

提前致谢.

Bar*_*mar 6

使用:

SELECT DISTINCT resource.id, resource.name, resource.group
Run Code Online (Sandbox Code Playgroud)

删除重复项.

内部联接在概念上的工作方式是它在两个表之间产生完整的交叉产品.此交叉产品在输入表中为每行包含一行.然后,它使匹配所有的行ONWHERE条件,并返回此作为结果集.如果两个表之间有多个匹配的行,您将在结果集中获得多行.

如果您从两个表中选择列,您会发现它们实际上并不是同一行.它们只有resource表中的相同数据,但表中的数据不同resource_access.但是你没有在结果中显示后面的那些列.使用DISTINCT合并结果中的所有这些行.