为啥以下查询不会生成最受欢迎公寓的 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】:

你不能像那样返回你想要的最大值。 使用CTEis_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 和地址?的主要内容,如果未能解决你的问题,请参考以下文章

最受欢迎的 10 本编程书籍(文末附地址)

前端|5个最受欢迎的前端框架对比

Ubuntu以40%占比,成为OpenStack部署中最受欢迎操作系统

PHP/MYSQL 查询:获取结果上方和下方的行!

2022 最受欢迎的 CSS 类名和 ID 分别是什么

最受欢迎的6种前端开发框架对比