我正在创建一个小网站。假设它有下表
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]')
我是新手。非常感谢!
答案 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;