【问题标题】:SQL: Count (*) WHERE multiple matches are expectedSQL: Count (*) WHERE 需要多个匹配项
【发布时间】:2020-01-18 23:04:52
【问题描述】:

我希望构建的查询如下:

  1. 查找所有与categoryId 匹配的video 字段
  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 等于...一个ID 列表。 SQL 不买账。

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

我发现的“解决方法”是将video 行限制为一行。但是,当然,这不会给我一个完整的输出。

我会非常感谢所有提示,甚至是答案。

【问题讨论】:

  • 你使用什么数据库?
  • @VBoka 我用的是 PostgreSQL
  • =改成IN
  • @Nick 哇哦!非常感谢!如果您想发布答案,请继续,我会适当地标记它。

标签: sql postgresql count sum


【解决方案1】:

您只需将= 运算符更改为IN

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

【讨论】:

    【解决方案2】:

    我只想说明你也可以使用= 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'
                            );
    

    我强烈建议您不要在标识符周围加上双引号。它们只是使查询变得混乱。

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2011-01-16
      相关资源
      最近更新 更多