需要MySQL选择查询帮助

时间:2014-01-13 16:52:06

标签: mysql

我目前有一个网络应用,用户可以在其中分享帖子并与其他用户建立联系。我将每个帖子存储在一个名为“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”,则跳过该帖子。

我该如何撰写此查询?

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的地方。