需要SQL查询的帮助.使用外部连接或联合合并项


Need help for SQL QUERY. Merging items using outer joins or union

[TABLE 1]
+---------+---------+------------------+
| post_id | user_id | description      |
+---------+---------+------------------+
|  1      | 1       | Sample post 1    |
|  2      | 1       | Sample post 2    |
|  3      | 2       | Sample post 3    |
|  4      | 2       | Sample post 4    |
|  5      | 3       | Sample post 5    |
+---------+---------+------------------+
[TABLE 2]
+---------+---------+---------+
| id      | user_id | post_id |
+---------+---------+---------+
|  1      | 1       |  1      |
|  2      | 2       |  2      |
+---------+---------+---------+

当表1中的USER_ID 1和它所尊重的POST_ID已经存在于表2中时,它不应该是return select查询的一部分。相反,它将返回表1中的POST_ID 2、3、4、5。

当表1中的USER_ID 2和它所尊重的POST_ID已经存在于表2中时,期望返回的select查询将是表1中的POST_ID 1,3,4,5以及其他id。

提前感谢各位!:)

看起来一个反连接模式可以达到指定的结果。

 SELECT t.post_id
      , t.user_id
      , t.description
   FROM `[Table 1]` t
   LEFT
   JOIN `[Table 2]` u
     ON u.post_id = t.post_id
    AND u.user_id = ?  
  WHERE u.post_id IS NULL
  ORDER BY t.post_id

?是用于指定用户标识的占位符。

这实际上表示返回表1中的所有行以及表2中的匹配行,但是(这里有技巧)WHERE子句要求排除在表2中找到匹配行的所有行。只留下表1中与表2不匹配的行。

反连接需要你花一点功夫才能理解,但是一旦你掌握了它,它将是一个非常有用的工具,可以放在SQL工具带中。

还有其他查询模式将返回等效的结果,例如NOT EXISTS (correlated subquery)或更常见的NOT IN (subquery)。(使用NOT IN时,要注意子查询不返回任何NULL值。)

编辑

从连接谓词中删除条件u.user_id = t.user_id。看起来[Table 1]中的user_id是这篇文章的"作者"。并且与用户是否"查看"帖子无关。

根据您的示例数据,由于表1中的USER_ID 1已经存在于表2中,并且其尊重的POST_ID,因此它应该返回POST_ID 2,3,4,5。

查询:

SELECT t1.* FROM table2 t2
RIGHT OUTER JOIN table1 t1
ON t2.user_id = t1.user_id AND t2.post_id = t1.post_id
WHERE t2.user_id IS NULL

最终结果:

post_id     user_id     description
2           1           Sample post 2
3           2           Sample post 3
4           2           Sample post 4
5           3           Sample post 5

这是你要找的吗?