我目前有一个网络应用,用户可以在其中分享帖子并与其他用户建立联系。我将每个帖子存储在一个名为“posts”的表中,以及一个名为“relations”的表中用户之间的所有关系
“帖子”的结构是:
+-------------+-----------+---------+------------+----------------+
| post_id | user_id | text | date | privacy |
+-------------+-----------+---------+------------+----------------+
| 1 | 4 | Hello | 1/13/2014 | 2 |
+-------------+-----------+---------+------------+----------------+
Privacy can either be 1 or 2
“关系”的结构是:
+-------------+-----------+------------+------------+
|rel_id | sender | recipient | status |
+-------------+-----------+------------+------------+
| 1 | 17 | 4 | 1 |
+-------------+-----------+------------+------------+
Status can either be 1 or 2
现在,我希望有一个“新闻Feed”页面,用户可以看到他们是朋友的人(状态= 2)或跟随(状态= 1)的所有帖子。但是我遇到了查询问题。我知道如何做简单的选择查询,但我不认为这是可能的。
所以,我想从“posts”表中选择所有帖子,其中'user_id'与“relations”表中的'recipient'相同,其中发送者等于'17'(我要去使用变量)。现在最重要的是,如果“relations”中该行的状态为“1”而“posts”行中的“privacy”为“2”,则跳过该帖子。
我该如何撰写此查询?
答案 0 :(得分:1)
使用joins
SELECT * FROM `posts`
join `relations` on `recipient` = `user_id`
WHERE `status` = 2
答案 1 :(得分:0)
使用joins和where子句,如下所示:
SELECT *
FROM posts p
JOIN relations r ON p.user_id = r.recipient
WHERE (r.status = 1 OR r.status = 2)
AND (r.status != 1 OR p.privacy != 2);
为简洁起见,它有助于对表格进行别名(例如“post p”),以便您随后可以特别引用每个表中的字段(例如“p.privacy”)。
这将连接表,包括relations.status为1或2的任何表,但跳过任何两个relations.status为1且posts.privacy为2的地方。