SQL:如何做一个for循环

时间:2019-04-09 14:49:08

标签: sql loops

我有这个SQL查询:

SELECT count(commentratings.ID) AS count, user_ID FROM `commentratings`
WHERE comment_ID = ANY (SELECT ID FROM `ratings` WHERE user_ID = 2) AND rating_direction = 1

它返回user_ID = 2的用户的投票数(如预期)。

我不仅要为该特定用户,而且要为数据库中的所有用户获得此计数。我得到所有相关的ID

SELECT user_ID from users

如何更改第一个查询,以使其返回所有用户的所有计数?我想那一定是某种for循环,它会循环子查询中的ID。伪代码:

for i in (SELECT user_ID from users):
   SELECT count(commentratings.ID) AS count, user_ID FROM `commentratings`
   WHERE comment_ID = ANY (SELECT ID FROM `ratings` WHERE user_ID = i) AND 
   rating_direction = 1

如何使用SQL实现此功能? 非常感谢!

3 个答案:

答案 0 :(得分:0)

在原始查询之后,您可以执行另一个子查询:

SELECT count(commentratings.ID) AS count, user_ID 
FROM `commentratings`
WHERE comment_ID = ANY (SELECT ID 
                    FROM `ratings` 
                    WHERE user_ID in (SELECT user_ID from users)) 
AND rating_direction = 1

尽管,我认为您的第一个查询使用联接会更好,但是我可能无法完全了解数据库模型是什么。

答案 1 :(得分:0)

尝试类似的东西:

select users.user_id,
       count(*) num_upvotes
from users
     left outer join ratings on ratings.user_id = users.user_id
where ratings.rating_direction = 1
group by users.user_id

答案 2 :(得分:0)

如果您要像for循环那样遍历列的每个值,则可以使用cursor

看起来像这样

DECLARE @UserID int
DECLARE UserIDs CURSOR LOCAL FOR SELECT user_ID from users

OPEN UserIDs 
FETCH NEXT FROM UserIDs into @UserID 
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT count(commentratings.ID) AS count, user_ID FROM `commentratings`
WHERE comment_ID = ANY (SELECT ID FROM `ratings` WHERE user_ID = @UserID) AND rating_direction = 1

    FETCH NEXT FROM UserIDs into @UserID 
END

CLOSE UserIDs 
DEALLOCATE UserIDs 

Iterate through rows in SQL Server 2008