我有一堆用戶,每個用戶都有很多帖子。 架構:SQL查詢中至少有一項
Users: id
Posts: user_id, rating
如何找到誰擁有至少一個支柱評級以上的所有用戶,比方說,10?
我不確定是否應該使用子查詢,或者如果有更簡單的方法。
謝謝!
我有一堆用戶,每個用戶都有很多帖子。 架構:SQL查詢中至少有一項
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子句中的過濾。
相關性(WHERE p.user_id = u.id)是爲什麼這被稱爲相關子查詢,除了評級比較之外,它只會返回ID值匹配的USERS表中的行。
根據具體情況,EXISTS也更快,因爲只要符合條件,它就會返回true - 重複項無關緊要。
使用內部連接:
SELECT * from users INNER JOIN posts p on users.id = p.user_id where p.rating > 10;
如果用戶有超過10個評級的評級超過10個,則會返回重複項。添加'DISTINCT',或查看我的查詢以尋找替代方案。 – 2010-07-07 17:36:31
如果你只是想要一個用戶列表,使用上面的,但用不同的用戶替換* .id – Kendrick 2010-07-07 17:36:40
你可以加入表中查找相關用戶,並使用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
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;
此外,這將告訴你他們的最高評價是什麼。
抱歉 - 重新格式化以停止滾動。更容易閱讀,更容易投票。 – 2010-07-07 17:50:13
謝謝,看起來好多了。 – Zak 2010-07-07 18:05:08
正如你所說的問題的正確答案是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測試上這可能是有用的。
select distinct id
from users, posts
where id = user_id and rating > 10
你可以向我解釋這一點。內部查詢將獲取任意數量的NULL行。然後,EXISTS將其歸結爲真或假,那麼它是不是隻能得到所有用戶,或者沒有? – ash 2010-07-07 17:52:30
@Jasie:EXISTS並不在乎它裏面的SELECT語句 - 你可以用1/0替換NULL,這會導致數字錯誤被零除......但它不會,因爲EXISTS只關心在WHERE子句中進行過濾。相關性(WHERE p.user_id = u.id')就是爲什麼這稱爲相關子查詢,除了評級比較之外,它只會返回ID值匹配的USERS表中的行。 – 2010-07-07 17:54:40
@Jasie:根據具體情況,EXISTS也更快,因爲只要符合標準,EXISTS就會返回true - 重複項無關緊要。 – 2010-07-07 17:59:30