所以,我试图向所有作家展示大多数使用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
答案 0 :(得分:1)
要使作家拥有最多的书籍,只需order by
和limit
:
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
答案 1 :(得分:0)
您可以使用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 |