[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
这是你要找的吗?