我正在创建一个小网站。假设它有以下表
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]')
我是新手。很多谢谢!
解决方案是:
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_id到你的blocks表。您加入被阻止的用户,并通过block_id IS NULL过滤它们。如果你有问题,请评论
您自己的查询在可读性方面优于建议的答案-这就是SQL的全部内容。
保留你的查询;它非常适合这个任务,因为它读起来应该是这样的:"选择所有帖子,除了那些来自当前用户阻止的用户的帖子"。
检查-
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;