[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已经存在于表2中且具有其受尊重的POST_ID时,它不应该是返回选择查询的一部分。相反,它将返回表1中的POST_ID 2,3,4,5。
当表1中的USER_ID 2已经存在于表2中且具有其受尊重的POST_ID时,预期的返回选择查询将是表1中的POST_ID 1,3,4,5以及其他id。
先谢谢你们! :)
答案 0 :(得分:0)
看起来反连接模式可以达到指定的结果。
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
。看起来user_id
中的[Table 1]
是"作者"的帖子。并且与用户是否已观看"无关。一个帖子与否。
答案 1 :(得分:0)
基于您的示例数据,因为表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
这是你在找什么?