php - 如何使用 mysql 数据库创建阻塞系统?

标签 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              | 2

用户可以屏蔽他们想要屏蔽的任何人,如果屏蔽发生,两个用户将不会再在他们的动态消息中看到彼此的帖子。

从我的表来看,这意味着 user1user2 不会看到彼此的帖子,但“user3”通常会看到每个人的帖子,因为他不属于该表 block 。

    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_byblock_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']}
)

访问 $_SESSION 数组中的字段时,您还应该使用引号($_SESSION['userid'] 而不是 $_SESSION[userid]).

关于php - 如何使用 mysql 数据库创建阻塞系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32623429/

相关文章:

php - 使用 tmhOAuth 和 PHP 显示最新的 Twitter Feed "date created"

php - ubuntu 上使用 xampp 的虚拟主机配置错误

PHP 查询使用 WHERE、AND & OR 语句问题

mysql - 在 SQL 中生成与列中的整数一样多的行

php - Cakephp 查询未呈现正确的数据

php - 在 PHP 中覆盖子类中的函数时更改返回类型?

mysql - 用于 MySQL 和 MongoDB 的带有 Database_Cleaner 的 Cucumber

php - 'reportes.id_usuario' 中的未知列 'on clause'

sql - 如何只选择一个表中包含另一个表中所有值的记录?

sql - 奇怪的 PostgreSQL "value too long for type character varying(500)"