我有一群用户,每个人都有很多帖子. 架构:

Users: id
Posts: user_id, rating

我如何找到至少有一篇文章的评分高于10分的所有用户?

我不确定是否应该使用子查询,或者是否有更简单的方法.

谢谢!

推荐答案

要查找至少有一个帖子的评分高于10的所有用户,请使用:

SELECT u.*
  FROM USERS u
 WHERE EXISTS(SELECT NULL
                FROM POSTS p
               WHERE p.user_id = u.id
                 AND p.rating > 10)

EXISTS不关心其中的SELECT语句——可以用1/0替换NULL,这将导致除以零的数学错误...但它不会,因为EXISTS只关心WHERE子句中的过滤.

相关性(其中p.user_id=u.id)就是为什么这称为相关子查询,除了评级比较之外,它还将只返回id值匹配的USERS表中的行.

EXISTS也会更快,这取决于具体情况,因为一旦满足条件,它就会返回true——重复项无关紧要.

Database相关问答推荐

位置运算符($)工作不正确

如何在没有sqlmock的情况下模拟db ping

术语 SSTable 和 LSM Tree 有什么区别

什么是范围锁( range-locks)?

数据库中的每个表都应该有一个 SQLiteOpenHelper 吗?

tzname字段/时区标识符名称的最大长度

PostgreSQL - 按时间戳值分组?

SQL Server 2008如何同步不同服务器中的数据库?

当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?

如何禁用 Django 查询缓存?

Laravel 5 从 URL 获取 ID

在 sql server 中存储持续时间(时间跨度)

在表上插入或更新违反外键约束

无法启动 MongoDB:Windows 中的系统错误 1067

在 MySQL 中实现一对一关系时确定外键

PostgreSQL - 将每个表转储到不同的文件中

唯一(多列)并且在一列中为空

如何处理数据库中用户的身份验证/授权?

sqlite 时间戳格式化

Rake aborted... table ‘users’ already exists