SQL: Количество (*) ГДЕ ожидается несколько совпадений - PullRequest
1 голос
/ 19 января 2020

Запрос, который я буду sh построить, выглядит следующим образом:

  1. найти все video соответствующие categoryId поля
  2. найти history записей для каждой из них
  3. и, наконец, для их подсчета / суммирования.

Запрос, который мне удалось построить до сих пор:

(SELECT COUNT(*) 
 FROM "histories" as "history" 
 WHERE "history"."videoId" = 
                  (SELECT "id" 
                   FROM "videos" 
                   WHERE "videos"."categoryId" = '9f5a0e6f-512b-425a-9225-600f876c0105' ))

Я думаю, вы можете ясно видеть сквозь где проблема уже есть. Я выбираю все записи, где videoId равно ... список идентификаторов. SQL не покупает его.

SQL ERROR: more than one row returned by a subquery used as an expression

"Обходной путь", который я нашел, заключался в том, чтобы ограничить строки video только одной. Но, конечно, это не дало бы мне полную отдачу.

Я буду очень признателен за все советы или, возможно, даже ответы.

Ответы [ 2 ]

2 голосов
/ 19 января 2020

Вам просто нужно изменить оператор = на IN:

(SELECT COUNT(*) 
 FROM "histories" as "history" 
 WHERE "history"."videoId" IN  
                  (SELECT "id" 
                   FROM "videos" 
                   WHERE "videos"."categoryId" = '9f5a0e6f-512b-425a-9225-600f876c0105' ))
0 голосов
/ 19 января 2020

Я просто хочу отметить, что вы также можете использовать = any:

SELECT COUNT(*) 
FROM "histories" as h
WHERE h."videoId" = ANY (SELECT v."id" 
                         FROM "videos" v
                         WHERE v."categoryId" = '9f5a0e6f-512b-425a-9225-600f876c0105'
                        );

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

...