需要帮助SQL QUERY。使用外连接或联合合并项目

时间:2016-09-14 01:17:03

标签: php mysql

[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。

先谢谢你们! :)

2 个答案:

答案 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

这是你在找什么?