gpt4 book ai didi

sql - WHERE 中不允许使用聚合函数 - 加入 PostgreSQL 表时

转载 作者:行者123 更新时间:2023-11-29 11:59:35 25 4
gpt4 key购买 nike

在使用 PostgreSQL 9.3.10 的游戏中,一些玩家已经支付了“VIP 身份”,这由包含 future 日期的 vip 列表示:

# \d pref_users

Column | Type | Modifiers
------------+-----------------------------+--------------------
id | character varying(32) | not null
first_name | character varying(64) | not null
last_name | character varying(64) |
vip | timestamp without time zone |

玩家还可以通过将 nice 列设置为 truefalse 或将其保留为 null 来评价其他玩家:

 # \d pref_rep

Column | Type | Modifiers
-----------+-----------------------------+-----------------------------------------------------------
id | character varying(32) | not null
author | character varying(32) | not null
nice | boolean |

我通过发出此 SQL JOIN 语句来计算 VIP 玩家的“声誉”:

# select u.id, u.first_name, u.last_name, 
count(nullif(r.nice, false))-count(nullif(r.nice, true)) as rep
from pref_users u, pref_rep r
where u.vip>now()and u.id=r.id group by u.id order by rep asc;


id | first_name | last_name | rep
-------------------------+--------------------------------+--------------------
OK413274501330 | ali | salimov | -193
OK357353924092 | viktor | litovka | -137
DE20287 | sergej warapow |

我的问题是:

如何找到所有评价过其他玩家的负面评价玩家?

(背景是我已经为所有 VIP 玩家添加了评价他人的可能性。在此之前,只有积极评价的玩家才能评价其他人)。

我尝试了以下方法,但出现以下错误:

# select count(*) from pref_rep r, pref_users u 
where r.author = u.id and u.vip > now() and
u.id in (select id from pref_rep
where (count(nullif(nice, false)) -count(nullif(nice, true))) < 0);

ERROR: aggregate functions are not allowed in WHERE
LINE 1: ...now() and u.id in (select id from pref_rep where (count(null...
^

更新:

我正在尝试使用临时表 -

首先,我用所有负面评价的 VIP 用户填充它,这很有效:

# create temp table my_temp as select u.id, u.first_name, u.last_name,
count(nullif(r.nice, false))-count(nullif(r.nice, true)) as rep
from pref_users u, pref_rep r
where u.vip>now() and u.id=r.id group by u.id;

SELECT 362

但是我的 SQL JOIN 返回太多相同的行,我找不到那里缺少什么条件:

 # select u.id, u.first_name, u.last_name 
from pref_rep r, pref_users u, my_temp t
where r.author=u.id and u.vip>now()
and u.id=t.id and t.rep<0;

id | first_name | last_name
-------------------------+--------------------------------+----------------------------
OK400153108439 | Vladimir | Pelix
OK123283032465 | Edik | Lehtik
OK123283032465 | Edik | Lehtik
OK123283032465 | Edik | Lehtik
OK123283032465 | Edik | Lehtik
OK123283032465 | Edik | Lehtik
OK123283032465 | Edik | Lehtik

同样的问题(多行具有相同的数据)我得到的声明:

# select u.id, u.first_name, u.last_name 
from pref_rep r, pref_users u
where r.author = u.id and u.vip>now()
and u.id in (select id from my_temp where rep < 0);

我想知道这里可能缺少什么条件?

最佳答案

首先,我会这样写你的第一个查询:

select
u.id, u.first_name, u.last_name,
sum(case
when r.nice=true then 1
when r.nice=false then -1
end) as rep
from
pref_users u inner join pref_rep r on u.id=r.id
where
u.vip>now()
group by
u.id, u.first_name, u.last_name;

(和你的一样,但我觉得更清楚)。

要查找负面评价的玩家,您可以使用与之前相同的查询,只需添加 HAVING 子句:

having
sum(case
when r.nice=true then 1
when r.nice=false then -1
end)<0

要找到对玩家进行过评分的负面评分玩家,一种解决方案是:

select
s.id, s.first_name, s.last_name, s.rep
from (
select
u.id, u.first_name, u.last_name,
sum(case
when r.nice=true then 1
when r.nice=false then -1
end) as rep
from
pref_users u inner join pref_rep r on u.id=r.id
where
u.vip>now()
group by
u.id, u.first_name, u.last_name
having
sum(case
when r.nice=true then 1
when r.nice=false then -1
end)<0
) s
where
exists (select * from pref_rep p where p.author = s.id)

最终可以从内部查询中删除 having 子句,您可以在外部查询中使用这个 where 子句:

where
rep<0
and exists (select * from pref_rep p where p.author = s.id)

关于sql - WHERE 中不允许使用聚合函数 - 加入 PostgreSQL 表时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34340543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com