SQL: Как сделать вид цикла for - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть этот запрос 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 (как и ожидалось).

Я бы хотел, чтобы этот счет нетолько для этого конкретного пользователя, но для всех пользователей в базе данных.Я получаю все соответствующие идентификаторы с

SELECT user_ID from users

. Как я могу изменить первый запрос, чтобы он возвращал все значения для всех пользователей?Полагаю, это должен быть какой-то цикл for, который перебирает идентификатор в подзапросе.Псевдокод:

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 голосов
/ 09 апреля 2019

Попробуйте что-то вроде:

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
0 голосов
/ 09 апреля 2019

Если вы хотите перебрать каждое значение столбца, например, цикл for, вы можете использовать курсор

Это выглядит так

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 

Итерация по строкам в SQL Server 2008

0 голосов
/ 09 апреля 2019

Следуя исходному запросу, вы можете выполнить еще один подзапрос:

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

Хотя, я думаю, ваш первый запрос будет лучше при объединении, но я не совсем понимаю, какая модель базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...