【问题标题】:Join left 4 tables, or Union all Sql加入左4个表,或联合所有Sql
【发布时间】:2018-08-07 09:44:49
【问题描述】:

这个问题有点复杂,因为在一个 SQL 查询中混合了 4 个表。我已经开发了查询,但它仍然返回与预期不同的行数。

用户

id_user  |   name
  1           A
  2           B
  3           C
  4           D
  5           E

社区

 id_following  |    id_follower | id_followed
    1                   3               4
    2                   3               5

分享

  id_share | id_post_shared | id_sharer | id_user_post
     1              7           5           1
     2              8           4           2
     3              9           5           4

帖子

    id_post | id_user_post | post
     1              4           Hi
     2              5           Hello
     3              2           Hey you
     4              3           come on
     5              4           here is good
     6              5           go home 
     7              1           lets go home
     8              2           go away
     9              4           come here
    10              1           show

我想检索我关注的用户(用户 3)的帖子以及我关注的同一个人与其他人分享的帖子(如转发)。

所以从表格中我希望得到这个输出(8 个结果)

  1             4           Hi
  2             5           Hello
  5             4           here is good
  6             5           go home 
  7             1           lets go home (shared by 5)
  8             2           go away (shared by 4)
  9             4           come here (shared by 5)
  9             4           come here

(意识到#9 重复,因为这是我关注的某人的帖子,同时被用户 5 分享或转发)

这是我的代码,但经过几次测试后,我不确定我想要的内容是否遵循这种模式

SELECT 
    u.name AS n, p.post AS t
FROM  
    users AS u
LEFT JOIN  
    community AS c ON u.id_user = c.id_followed
LEFT JOIN 
    sharing AS r ON r.id_sharer = c.id_followed
LEFT JOIN 
    posts AS p ON p.id_user = c.id_followed OR p.id_user = r.id_sharer
WHERE 
    c.id_follower = 3  
    AND p.id_user != 3

【问题讨论】:

  • "posts AS p ON p.id_user = c.id_followed OR p.id_user = r.id_sharer" 不会带回所有帖子,因为它左加入社区和共享表。 >
  • 我应该改用什么

标签: sql join left-join union


【解决方案1】:

好的,这个版本给你发了两次9:

DECLARE 
    @userIcareabout AS TINYINT
SET 
    @userIcareabout = 3 
SELECT
    p.id_post,
    p.id_user_post,
    p.post
FROM
    Posts AS p
WHERE
    p.id_post IN 
    (
    SELECT
        id_post AS post
    FROM
        Posts
    WHERE
        id_user_post IN 
        (
        SELECT 
            id_followed 
        FROM 
            Community
        WHERE
            id_follower = @userIcareabout
        )
    )
UNION ALL   
SELECT
    p.id_post,
    p.id_user_post,
    p.post
FROM
    Posts AS p
WHERE
    p.id_post IN    
    (
    SELECT  
        id_post_shared AS post,
        id_sharer AS poster
    FROM
        Sharing 
    WHERE
        id_user_post IN 
        (
        SELECT 
            id_followed 
        FROM 
            Community
        WHERE
            id_follower = @userIcareabout
        )
    )

【讨论】:

  • 感谢您的方法,所以您的意思是它根本不会检索重复项?
  • 它会检索它们,但只会检索一次。所以帖子 9 只会出现一次。
  • 我正在测试你的代码,正如你所说的那样工作。显示额外的行需要什么。
  • 我编辑了查询,使其显示多余的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2016-12-13
  • 2017-02-07
相关资源
最近更新 更多