2010-07-07 71 views
8

我有一堆用户,每个用户都有很多帖子。 架构:SQL查询中至少有一项

Users: id 
Posts: user_id, rating 

如何找到谁拥有至少一个支柱评级以上的所有用户,比方说,10?

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

谢谢!

回答

19

要查找所有用户提供至少一个支柱评级高于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 - 重复项无关紧要。

+0

你可以向我解释这一点。内部查询将获取任意数量的NULL行。然后,EXISTS将其归结为真或假,那么它是不是只能得到所有用户,或者没有? – ash 2010-07-07 17:52:30

+1

@Jasie:EXISTS并不在乎它里面的SELECT语句 - 你可以用1/0替换NULL,这会导致数字错误被零除......但它不会,因为EXISTS只关心在WHERE子句中进行过滤。相关性(WHERE p.user_id = u.id')就是为什么这称为相关子查询,除了评级比较之外,它只会返回ID值匹配的USERS表中的行。 – 2010-07-07 17:54:40

+0

@Jasie:根据具体情况,EXISTS也更快,因为只要符合标准,EXISTS就会返回true - 重复项无关紧要。 – 2010-07-07 17:59:30

1

使用内部连接:

SELECT * from users INNER JOIN posts p on users.id = p.user_id where p.rating > 10; 
+1

如果用户有超过10个评级的评级超过10个,则会返回重复项。添加'DISTINCT',或查看我的查询以寻找替代方案。 – 2010-07-07 17:36:31

+0

如果你只是想要一个用户列表,使用上面的,但用不同的用户替换* .id – Kendrick 2010-07-07 17:36:40

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 
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; 

此外,这将告诉你他们的最高评价是什么。

+0

抱歉 - 重新格式化以停止滚动。更容易阅读,更容易投票。 – 2010-07-07 17:50:13

+0

谢谢,看起来好多了。 – Zak 2010-07-07 18:05:08

0

正如你所说的问题的正确答案是OMG Ponies的答案,WHERE EXISTS更具描述性,几乎总是更快。但是“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测试上这可能是有用的。

1
select distinct id 
from users, posts 
where id = user_id and rating > 10 
相关问题