2010-07-07 70 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 
相關問題