Php 如何使用mysql数据库创建阻塞系统?
我创建了一个小型社交网站,它有三个简单的表格,如下所示Php 如何使用mysql数据库创建阻塞系统?,php,mysql,sql,Php,Mysql,Sql,我创建了一个小型社交网站,它有三个简单的表格,如下所示 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
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
用户可以阻止他们想要的任何人,如果发生阻止,两个用户将不再在他们的新订阅源上看到彼此的帖子。从我的表中可以看出,这意味着
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的帖子,但user2仍然可以看到user1的帖子,这是我不想要的。对于这种情况,我能做的最好的查询是什么?
还请考虑一下我的数据库设计好吗?您可以建议我,非常感谢:)您必须检查
block\u by
和block\u to
字段
SELECT * FROM Post p
WHERE p.user_id NOT IN (
SELECT b.blocked_to AS userId FROM Block b
WHERE b.block_by = {$_SESSION['userid']}
UNION DISTINCT
SELECT b.blocked_by AS userId FROM Block b
WHERE b.block_from = {$_SESSION['userid']}
)
在访问
$\u SESSION
数组中的字段时,也应该使用引号($\u SESSION['userid']
,而不是$\u SESSION[userid]
)。我会尝试加入Post
和Block
表,以过滤掉给定用户请求的帖子(通过会话获得的帖子)属于其他可能被阻止的用户:
SELECT * FROM Post p INNER JOIN Block b
ON p.user_id = b.blocked_by
WHERE b.blocked_to <> '$_SESSION[userid]'
首先,我认为这是表示双向关系最简单的方法。在最坏的情况下,
块
表的大小会加倍。此外,您不知道在将来的某个时候,您是否会遇到一个场景,其中块是单向的。例如,您可能允许用户1阻止用户2,其中用户1仍然可以阅读用户2的帖子,但反之亦然。对不起,我还没有完全考虑过这一点,但我认为您可以在用户不在任何一个块列的情况下使用到块表的联接。然而,我认为这意味着每个Post都将连接到块表中的每一个符合条件的行,因此添加了“distinct”以避免重复。我不确定优化器是否能够在不进行大量表扫描的情况下处理这些问题,但这里有一个想法,供讨论
select distinct post.id from Post
left outer join Block on block_by <> $_SESSION['userid']
and blocked_to <> $_SESSION['userid'];
从post中选择distinct post.id
通过$\u会话['userid']在块上左外部联接块
并阻止了_到$_会话['userid'];
我已经试过了,但没有成功,user2仍然可以看到user1的帖子。我想我可能会创建两个关系,一个是Block2,另一个是Block1,只有我现在能找到解决方案。@Marcus我已经更新了我的答案。请您再试一次好吗?是的,非常感谢@mapek和所有人的回答:)如果用户1阻止了用户2,那么用户2应该仍然能够阻止用户1。当只有一个人说只有一段感情时,你不能挽救两段感情吗?我的设计允许两种关系都存在,或者只存在一种关系。若用户在blocks表上并没有记录,该怎么办?
select distinct post.id from Post
left outer join Block on block_by <> $_SESSION['userid']
and blocked_to <> $_SESSION['userid'];