子查询未从不同的 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;
你好,我是 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;