有四张桌子。
项目(项目ID、项目名称、项目所有者)
组(grp_id、grp_name、grp_owner)
用户(grp_id,usr_ref)
共享(项目ID,组ID)
我的目标是获取item_owner=user_id(比如123)或user_id属于共享该项的组的所有项的列表。
检索与特定用户id所属的组共享的所有项的基本查询实现是

select i.item_id from items i
left outer join share on share.item_id = i.item_id
left outer join users on users.grp_id = share.grp_id
left outer join groups on groups.grp_id = share.grp_id
where users.usr_ref = user_id

为了包含用户id为所有者的所有其他元素,我做了如下操作
select * from items where owner = user_id or item_id in (
select i.item_id from items i
left outer join share on share.item_id = i.item_id
left outer join users on users.grp_id = share.grp_id
left outer join groups on groups.grp_id = share.grp_id
where users.usr_ref = user_id )

我认为这是一个非常糟糕的实现,因为每次从连接获取的数组中都需要搜索项id。如何改进我的sql语句。
还有没有其他方法可以重新设计表结构,以便以其他方式实现查询?
先走一步。

最佳答案

在这种情况下,您需要INNER JOIN,因为您需要获得一个在所有表上都有连接的项。您当前的查询使用LEFT JOIN这就是为什么列表中甚至会显示未与任何用户关联的项。试试这个,

SELECT  DISTINCT a.*
FROM    items a
        INNER JOIN `share` b
            ON a.item_ID = b.item_ID
        INNER JOIN groups c
            ON b.grp_ID = c.grp_ID
        INNER JOIN users d
            ON c.grp_ID = d.grp_ID
WHERE   d.usr_ref = user_ID

若要进一步了解有关联接的更多信息,请访问以下链接:
Visual Representation of SQL Joins

09-25 18:21
查看更多