子查询未从不同的 table 返回计数值

Subquery is not returning a count value from a different table

你好,我是 postgresql 的新手,一段时间以来一直被以下问题困扰。下面我有两个 tables: Table 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
 ....

Table 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
....

我的任务是同时使用 table 并找出哪些登录更改了头像中的性别 table 并显示个人拥有的“头像”总数。例如 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;

知道如何计算每次登录的所有头像并将它们显示在 table 上,如下所示:

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

嗯。 . .我想你想要过滤聚合:

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 至少有一处不匹配。

只需要去掉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;