为啥以下查询不会生成最受欢迎公寓的 ID 和地址?
Posted
技术标签:
【中文标题】为啥以下查询不会生成最受欢迎公寓的 ID 和地址?【英文标题】:Why wouldn't the following query produce the ids and addresses of the most popular apartments?为什么以下查询不会生成最受欢迎公寓的 ID 和地址? 【发布时间】:2019-12-20 04:24:56 【问题描述】:我有一个简单的数据库,其中一张表中包含公寓,另一张表中包含对这些公寓感兴趣的人的 ID(或他们的 ID)。我正在尝试使用嵌套查询来获取对他们感兴趣的人最多的公寓
select toh.t, toh.o, toh.h
from (
select ok.houseid as t, va.houseaddress as o, count ( ok.customerid ) as h
from house va
inner join is_interested ok
on va.houseid = ok.houseid
group by t
) toh
group by toh.t
having toh.h = max( toh.h )
;
它没有做我想做的事。内部select
应该给我一个表格,其中包含 ID、地址,最后是对他们感兴趣的人的 ID 计数,按公寓 ID 分组,这 id 做得非常好。
因此问题很可能出在最后两行:
group by toh.t
having toh.h = max( toh.h )
因为它返回所有可用的公寓,无论有多少人对它们感兴趣。将其更改为
group by toh.t
having toh.h > 1
为我选择了正确的公寓(目前最多有 2 人对所述公寓感兴趣)。看起来我不完全理解函数 max
应该如何工作。 count
不应该返回一个整数,还是这首先与类型不匹配有关?因为它确实看起来确实如此。
【问题讨论】:
【参考方案1】:你不能像那样返回你想要的最大值。
使用CTE
从is_interested
获取所有计数,然后加入house
:
with
cte as (
select houseid, count(customerid) counter
from is_interested
group by houseid
)
select h.houseid, h.houseaddress, c.counter
from house h inner join (
select * from cte
where counter = (select max(counter) from cte)
) c on c.houseid = h.houseid
【讨论】:
这会引发错误Error: near line 1: near "select": syntax error
。定义为cte
的查询对我来说似乎完全有效,所以我不确定为什么会发生这种情况。
我在选择之前删除了,
。立即尝试。【参考方案2】:
在我看来,您指出的 2 行:
group by toh.t
having toh.h = max( toh.h )
有以下含义:
-
按
toh.t
键获取我的群组
在这些组中,仅显示toh.h
的值等于组中该字段值的最大值的组。如果我没看错,情况总是如此,因为组中的toh.t
中只有一个值。
我相信你想要的是在所有toh.h
分组之前取得全局最大值,对吧?
【讨论】:
差不多。但我不希望显示所述最大值本身,只是根据toh.h
是否等于最大值来显示其他信息。以上是关于为啥以下查询不会生成最受欢迎公寓的 ID 和地址?的主要内容,如果未能解决你的问题,请参考以下文章