【问题标题】:Subquery is not returning a count value from a different table子查询没有从不同的表返回计数值
【发布时间】:2020-11-23 21:32:07
【问题描述】:

您好,我是 postgresql 的新手,并且已经被以下问题困扰了一段时间。下面我有两个表: 表格1: 头像

  login   |    name     | gender |    race    
----------+-------------+--------+------------
 agnetha  | Flutter Shy | F      | faerie
 agnetha  | Flit        | F      | faerie
 agnetha  | Whisp       | F      | faerie
 astral   | Lightning   | F      | raccoon
 astral   | Elphaba     | F      | wizard
 bobby    | Steve       | M      | wizard
 bobby    | Wayne       | M      | footballer
 bobby    | Smiley      | M      | shark
 ....

表 2:玩家

  login   |  name   | gender |     address     |       joined        
----------+---------+--------+-----------------+---------------------
 agnetha  | Sarah   | F      | 191 Howth Ave   | 2016-08-01 17:50:44
 astral   | Jessie  | F      | 81 Franklin St  | 2016-05-28 21:21:21
 bobby    | Robert  | M      | 7 Avenue Rd     | 2016-07-19 12:00:59
 cait     | Caitlin | F      | 444 Sycamore Dr | 2016-08-05 23:51:17
 carter   | Lucy    | F      | 213 John Ave    | 2016-07-08 19:28:46
 cash     | Thomas  | M      | 213 John Ave    | 2016-07-04 15:37:59
....

我的任务是使用这两个表并找出哪些登录在头像表中改变了他们的性别,并显示个人拥有的“头像”的总和。示例 agnetha 有 3 个化身,astral 有 2 个,bobby 有 3 个。

我的问题是,当我尝试使用子查询进行计数时,postgresql 会说 用作表达式的子查询返回不止一行

到目前为止,这是我写的查询

SELECT player.login,player.name,player.gender, 
(SELECT count(avatar.login) FROM avatar group by login order by login)as avatars 
FROM player INNER JOIN avatar ON player.login = avatar.login AND avatar.gender <> player.gender 
GROUP BY avatar.login, player.login ORDER by login;

知道如何获取每次登录时所有头像的数量并将它们显示在如下所示的表格上:

  login  |  name   | gender | avatars 
---------+---------+--------+---------
 carter  | Lucy    | F      |       3
 coder   | Jeff    | M      |       3
 dazzle  | Alice   | F      |       3

【问题讨论】:

    标签: sql postgresql join subquery


    【解决方案1】:

    嗯。 . .我认为您希望通过过滤进行聚合:

    select p.login, p.name, p.gender, count(*)
    from player p join
         avatar a
         on p.login = a.login
    group by p.login, p.name, p.gender
    having count(*) filter (where a.gender <> p.gender) > 0;
    

    count(*) 计算所有头像。 having 子句检查不同性别的数量,要求logins 至少有一个不匹配。

    【讨论】:

    • 谢谢,成功了!我真的太复杂了......
    【解决方案2】:

    您只需要删除group by,添加where条件并调整子查询:

    SELECT DISTINCT(p.login), p.name, p.gender, 
    (SELECT COUNT(*) FROM avatar WHERE avatar.login = p.login) AS avatars 
    FROM player p INNER JOIN avatar a ON p.login = a.login AND a.gender <> 
    p.gender 
    ORDER BY p.login;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多