Mysql 多表联接中面临的问题
有四张桌子Mysql 多表联接中面临的问题,mysql,sql,join,Mysql,Sql,Join,有四张桌子 项目(项目id、项目名称、项目所有者) 组(组id、组名称、组所有者) 用户(grp\U id、usr\U ref) 共享(项目id、组id) 我的目标是获取所有项目的列表,其中项目所有者=用户id(比如123)或用户id属于与项目共享的组 检索与特定用户id所属的组共享的所有项的基本查询实现如下 select i.item_id from items i left outer join share on share.item_id = i.item_id left outer
- 项目(项目id、项目名称、项目所有者)
- 组(组id、组名称、组所有者)
- 用户(grp\U id、usr\U ref)
- 共享(项目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
为了包含user_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 )
我认为这是一个非常糟糕的实现,因为每次都需要在从连接获取的数组中搜索item_id。如何改进我的sql语句
还有没有其他方法可以重新设计表结构,以便以其他方式实现查询
提前准备好 在这种情况下,您需要
内部联接
,因为您需要获取一个在所有表上都有连接的项。您当前的查询使用了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
要进一步了解加入的更多信息,请访问以下链接:
- 我认为这会奏效
select i.item_id from items i
inner join share on share.item_id = i.item_id
inner join users on users.grp_id = share.grp_id
inner join groups on groups.grp_id = share.grp_id
where (users.usr_ref = @user_id or @user_id is null) and (i.item_id = @item_id or @item_id is null)
我猜您将始终传递一个或另一个参数,而不是两个参数,因此另一个(未传递的)将为null
还有,为什么要使用左连接?改为使用内部,因为您不需要空字段也许我不理解您的问题,但您能不能在第一个查询中使用
或
:
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 i.item_owner = @user_id or users.usr_ref = @user_id
没有
INNEROUTER
join。对不起,是打字错误取代了左外连接吗