SQL查询至少有一个东西

时间:2010-07-07 17:32:57

标签: sql mysql database

我有一堆用户,每个用户都有很多帖子。 架构:

Users: id
Posts: user_id, rating

如何找到所有至少有一个评分高于10?

的帖子的用户

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

谢谢!

6 个答案:

答案 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,这可能很有用。