Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多表联接中面临的问题_Mysql_Sql_Join - Fatal编程技术网

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)
我的目标是获取所有项目的列表,其中项目所有者=用户id(比如123)或用户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。对不起,是打字错误取代了左外连接吗