2013-05-02 13 views
3

有4个表格。在多个表格连接中面临问题

  • 项目(ITEM_ID,ITEM_NAME,item_owner)
  • 组(grp_id,_名称,grp_owner)
  • 用户(grp_id,usr_ref)
  • 份额(ITEM_ID,grp_id)

我目标是获得item_owner = user_id(比如123)或user_id属于与该项目共享的组的所有项目的列表。

一个基本的查询实现检索与哪个特定的user_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语句。

还有什么其他的方式,我可以重新设计我的表结构,以便我可以用其他方式实现查询?

Thanx提前。

回答

2

在这种情况下,您需要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 

为了进一步获得更多的知识有关加入,请访问以下链接:

0

我认为这会工作。

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) 

我猜,你将永远传递一个paramether或另外一个,不是两个,那么另一个(非通过)将是无效

也,你为什么用左手加入?使用内代替,因为你不想空字段

+1

没有'INNEROUTER'加盟。 – 2013-05-02 13:56:42

+0

对不起,是一个错字代替左外连接 – 2013-05-02 14:02:15

0

也许我不理解你的问题,但你能不能只用OR与第一个查询:

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