【问题标题】:Having + Max function not working as expected+ Max 功能无法按预期工作
【发布时间】:2019-12-07 23:49:28
【问题描述】:

所以,我试图向所有作家展示大多数书籍都是使用 have 编写的,我尝试了这个:

select *
from writer as a,(
SELECT writer_id,count(writer_id) as posts
FROM blog
GROUP BY writer_id
) as b WHERE a.id = b.writer_id 
GROUP BY writer_id
HAVING posts>=max(posts);

但是当我执行它时,它会返回整个表格,而不仅仅是那些书籍最多的表格。为什么不在这里工作?我想我错过了一些东西。如果我将 max(posts) 替换为示例表中的实际最大帖子数,则它可以工作。

我正在使用这个问题的示例表:Question

【问题讨论】:

  • 旁注:(1) 您不应再使用逗号分隔的连接。它们已在 1992 年的标准 SQL 中变得多余。(2)如果要计算记录,请使用 COUNT(*)COUNT(<expression>) 用于计算非空出现次数。使用count(writer_id),看起来writer_id 可能为空,而您希望从计数中省略这些行。
  • 您查询的问题是:对于每个作者,您加入了他们的博客数量。然后你按作家分组,这实际上没有任何作用,因为每个作家已经有一行。然后,您将作者的博客数与作者的最大博客数进行比较。您正在取一个数字的最大值,这只是数字本身。对于有十篇博客的作者,您说:如果 10 = 10,则返回这一行。对于有五个博客的作者,您说:如果 5 = 5,则返回这一行。您将返回所有行。

标签: sql database sqlite group-by


【解决方案1】:

要获得拥有最多书籍的作者,您只需 order bylimit

select w.name, count(*) no_of_books
from writer w 
join blog b on w.id = b.writer_id
group by w.id
order by no_of_books desc
limit 1

如果有顶级联系(即几位作家拥有最多的书籍)并且您想要全部获得,一个解决方案是使用having 子句进行过滤:

select w.name, count(*) no_of_books
from writer w 
join blog b on w.id = b.writer_id
group by w.id
having count(*) = (
    select count(*) from blog group by writer_id order by count(*) desc limit 1
)
order by w.name

【讨论】:

    【解决方案2】:

    你可以用rank()窗口函数来做到这一点:

    select w.*, t.counter 
    from writer w inner join (
      select writer_id, count(*) counter,
        rank() over (order by count(*) desc) rn
      from blog
      group by writer_id      
    ) t on t.writer_id = w.id
    where t.rn = 1
    

    此代码还会返回存在的关系。
    请参阅demo
    结果:

    | id  | name     | counter |
    | --- | -------- | ------- |
    | 3   | Writer C | 4       |
    

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      相关资源
      最近更新 更多