如何在一个语句中为三个表创建sql查询?

时间:2015-08-24 06:47:04

标签: php mysql sql

我正在创建一个小网站。假设它有下表

Table User
user_id | user_name
1       | a
2       | b
3       | c

Table Post
post_id | user_id (fk)
1       | 1
2       | 3
3       | 2
4       | 2

Table Block
block_by_user_id  | blocked_user_id (fk)
1                 | 2

我想在主页面中显示所有帖子。例如,当前用户为user 1此用户必须查看除user 2的帖子以外的所有帖子,因为用户1阻止了用户2,如您在阻止表中所见。

为当前用户会话假设$_SESSION['userid'] 查询应该如何?考虑表现。

这是我到目前为止所尝试过的,但我认为这可能不是最好的做法 select * from Post where user_id not in (select blocked_user_id from Block where block_by_user_id = '$_SESSION[userid]')

我是新手。非常感谢!

3 个答案:

答案 0 :(得分:3)

解决方案是:

SELECT *
FROM posts p

LEFT JOIN blocks b
    ON p.user_id = b.blocked_user_id
    AND b.block_by_user_id = 1

WHERE b.block_id IS NULL;

您需要在block表中添加block_id。您加入被阻止的用户,并通过block_id IS NULL过滤它们。如果您有任何疑问,请发表评论。

答案 1 :(得分:1)

您自己的查询在可读性方面优于建议的答案 - 这就是SQL的全部内容。

保持您的查询;它是完美的任务,因为它应该如下:"选择所有帖子,除了那些被当前用户阻止的用户"。

答案 2 :(得分:0)

检查 -

SELECT usr.user_id,pst.post_id 
FROM users AS usr 
JOIN posts pst ON pst.user_id=usr.user_id 
LEFT JOIN block blk ON usr.user_id=blk.blocked_user_id 
WHERE blk.id IS NULL;