我创建了一个小型的社交网站,它有三个简单的表格,如下所示。
Table User
id (pk) | user_name
1 | a
2 | b
3 | c
Table Post
id (pk) | user_id (fk)
1 | 1
2 | 3
3 | 2
4 | 2
Table Block
id (pk) | block_by (fk) | blocked_to (fk)
1 | 1 | 2
用户可以阻止任何他们想要的人,如果阻止发生,两个用户将不再在他们的新feed上看到彼此的帖子。
从我的表中可以看出
user1
和user2
不会看到彼此的帖子,但是'user3'通常会看到每个人的帖子,因为他不属于表块。 select * from Post p
where p.user_id not in
(select b.blocked_to from Block b
where b.block_by = '$_SESSION[userid]')
从SQL查询user1看不到user2的post,但是user2仍然看到user1的post,这是我不想要的。对于这种情况,我能做的最好的查询是什么?
还请考虑一下我的数据库设计是不是这样的好办法?你可以建议我,非常感谢:)
最佳答案
我将尝试加入Post
和Block
表,以便筛选出属于其他潜在被阻止用户的给定用户(通过会话获得)请求的帖子:
SELECT * FROM Post p INNER JOIN Block b
ON p.user_id = b.blocked_by
WHERE b.blocked_to <> '$_SESSION[userid]'
我还将稍微修改您的模式,以便在
Block
表中包含这两种关系:+---------+---------------+-----------------+
| id (pk) | block_by (fk) | blocked_to (fk) |
+---------+---------------+-----------------+
| 1 | 1 | 2 |
| 2 | 2 | 1 |
+---------+---------------+-----------------+
首先,我相信这是表示一种双向关系的最简单的方法。最坏情况下,
Block
表的大小会翻倍。此外,你不知道在未来的某个时候,你是否会有一个场景,其中一个块是单向的。例如,您可能允许用户1阻止用户2,其中用户1仍可以读取用户2的帖子,但反之亦然。关于php - 如何使用mysql数据库创建阻止系统?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32623429/