有没有办法用3个实体来改进这个SQL查询?

有没有办法用3个实体来改进这个SQL查询?,sql,join,Sql,Join,因此,在类似facebook的墙中,我们有实体: 墙柱。id,用户id,消息 使用者身份证,姓名 连接。user1\u id,user2\u id 我希望通过一个SQL查询获得id为x的用户的所有墙柱示例5 我试过: select wallPost.* from wallPost, Connections Where wallPost.user_id = x or (Connections.user1_id =x and wallPost.user_id = connections.use

因此,在类似facebook的墙中,我们有实体: 墙柱。id,用户id,消息 使用者身份证,姓名 连接。user1\u id,user2\u id

我希望通过一个SQL查询获得id为x的用户的所有墙柱示例5 我试过:

select wallPost.* from 
wallPost, Connections
Where 
wallPost.user_id = x
or 
(Connections.user1_id =x and wallPost.user_id = connections.user2_id) 
or  
(Connections.user2_id =x and wallPost.user_id = connections.user1_id) 
ORDER BY <field_name>
因此,除了可能产生的性能问题之外,当用户没有任何连接时,它也不能正常工作。我不想使用两个查询,因为我不想对结果进行排序


谢谢

您只需要wallPost的记录。我建议您删除from子句中的Connections表,并使用exists将逻辑放入子查询中:

为了获得最佳性能,您需要两个索引,一个在ConnectionUser2\u id上,一个在user1\u id上,另一个在ConnectionUser1\u id上,一个在user2\u id上。

为什么不能这样做

    SELECT WP.* FROM [WallPost] WP WITH (NOLOCK)  
       LEFT JOIN [Connections] CN WITH (NOLOCK) 
          ON ((WP.[User_Id] = CN.[User1_Id]) OR (WP.[User_Id] = CN.[User2_Id))
    WHERE (WP.[User_Id] = X) 

左连接将处理没有连接的用户。

如果要连接两个表,其中一个表可能没有另一个表指向的记录,则需要左连接。感谢您的答复,但我不能在此处仅使用左连接。因为我试图获取的是所有用户的帖子以及与用户有联系的用户的帖子。你是否遗漏了EXISTS关键字,或者这是一种我不知道的语法?我尝试使用子查询,就像你在这里看到的一样,但不起作用,1在子查询中是什么意思?我把它用在电脑上了,但又一次,我不认为这是最好的解决方案:选择wp.*从文章wp中选择wp.user\u id=1或wp.user\u id从连接c中选择c.user2\u id,其中c.user1\u id=1和wp.user\u id=c.user2\u id或wp.user\u id从连接c中选择c.user2\u id=1和wp.user\u id=c.user1_id@LarryLustig . . . 谢谢。谢谢,Mysql不支持WITH子句,这个查询将返回用户x发的所有帖子,我想得到的是用户x发的所有帖子和他的连接。因此,没有连接的用户如果发布了某些内容,仍然应该得到结果,而有连接的用户即使从未发布过某些内容,也应该能够看到其连接的帖子。好的,然后添加where子句:或WP。[User\u Id]=CN。[User1\u Id]或WP。[User\u Id]=CN。[User2\u Id]我以为您想优化此查询。在选择中使用。。。是的,没错,我使用的是@Gordon Linoff给出的解决方案。谢谢
select wp.*
from wallPost wp 
where 
wp.user_id = x 
or 
(wp.user_id in
      (select c.user2_id from connections c where c.user1_id = x ) 
)
or
(wp.user_id in (
      (select c.user1_id from connections c where c.user2_id = x )))
    SELECT WP.* FROM [WallPost] WP WITH (NOLOCK)  
       LEFT JOIN [Connections] CN WITH (NOLOCK) 
          ON ((WP.[User_Id] = CN.[User1_Id]) OR (WP.[User_Id] = CN.[User2_Id))
    WHERE (WP.[User_Id] = X)