我有一堆用户,每个用户都有很多帖子。 架构:
Users: id
Posts: user_id, rating
如何找到所有至少有一个评分高于10?
的帖子的用户我不确定我是否应该使用子查询,或者是否有更简单的方法。
谢谢!
答案 0 :(得分:22)
要查找至少有一个评分大于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子句中的过滤。
相关性(WHERE p.user_id = u.id)是为什么它被称为相关子查询,除了评级比较之外,它只返回id值匹配的USERS表中的行。
EXISTS也更快,具体取决于具体情况,因为只要符合条件它就会返回true - 重复无关紧要。
答案 1 :(得分:2)
您可以加入表格以查找相关用户,并使用DISTINCT,因此每个用户最多只能在结果集中一次,即使他们有多个评分为>的帖子10:
select distinct u.id,u.username
from users u inner join posts p on u.id = p.user_id
where p.rating > 10
答案 2 :(得分:1)
使用内部联接:
SELECT * from users INNER JOIN posts p on users.id = p.user_id where p.rating > 10;
答案 3 :(得分:1)
select distinct id
from users, posts
where id = user_id and rating > 10
答案 4 :(得分:0)
SELECT max(p.rating), u.id
from users u
INNER JOIN posts p on users.id = p.user_id
where p.rating > 10
group by u.id;
此外,这将告诉您他们的最高评级。
答案 5 :(得分:0)
正如所陈述的问题的正确答案是OMG小马的回答,其中EXESTS更具描述性,而且几乎总是更快。但是“SELECT NULL”对我来说看起来真的很丑陋和违反直觉。我已经看过SELECT *或SELECT 1作为最佳实践。
另一种方式,如果我们收集答案:
SELECT u.id
FROM users u
JOIN posts p on u.id = p.user_id
WHERE p.rating > 10
GROUP BY u.id
HAVING COUNT(*) > 1
如果你正在测试它并不总是1,这可能很有用。