以下查询为我提供了大于70的计数结果。
SELECT books.name, COUNT(library.staff)
FROM (library INNER JOIN books
ON library.staff = books.id)
GROUP BY library.staff,books.id
HAVING COUNT(library.staff) > 70;
如何修改查询以获得最大计数的结果?
答案 0 :(得分:2)
一种方法是order by
和limit
:
SELECT b.name, COUNT(l.staff) as cnt
FROM library l INNER JOIN
books b
ON l.staff = b.id
GROUP BY l.staff, b.name
ORDER BY cnt DESC
LIMIT 1;
我觉得很奇怪你是按两列分组,但只有一列在select
。但是,如果查询正在运行,那么它只是在寻找重复项。
答案 1 :(得分:1)
你可以这样做
SELECT books.name, COUNT(library.staff)
FROM (library INNER JOIN books
ON library.staff = books.id)
GROUP BY library.staff,books.id
HAVING COUNT(library.staff) = (select max(library.staff) from library);
答案 2 :(得分:0)
您可以订购()DESC和LIMIT 1
SELECT books.name, COUNT(library.staff)
FROM (library INNER JOIN books
ON library.staff = books.id)
GROUP BY library.staff,books.id
ORDER BY COUNT(library.staff) DESC
LIMIT 1
答案 3 :(得分:0)
您加入library.staff = books.id
。这是一个令人惊讶的命名惯例。书的ID等于"员工"图书馆?你应该提供表格定义和一些解释......
出于这个答案的目的,我们假设这是正确的。
除了使用表别名以提高可读性之外,您还可以在以下几个地方进行简化:
SELECT b.id, b.name, count(*) AS ct
FROM library l
JOIN books b ON b.id = l.staff
GROUP BY b.id -- l.staff -- redundant
HAVING count(*) > 70;
由于您加入b.id = l.staff
,l.staff
保证为NOT NULL
,因此请使用count(*)
,这样做会更快一些(单独实现count,只计算行而不查看列。)
GROUP BY b.id
在这种情况下没有l.staff
的情况也一样。
但由于您按b.id
分组,而不是b.name
分组,因此可能会有重复的名称,我们只能通过在结果中添加id
来区分 - 除非{{ 1}}是唯一的,您没有指定。
假设name
是看似合理的主键:
books.id
阅读整个表格或大部分表格,首先聚合然后加入通常要快得多。
使用EXPLAIN ANALYZE
进行测试。
要获得具有最大数量的结果,SELECT b.id, b.name, l.ct
FROM books b
JOIN (
SELECT staff AS id, count(*) AS ct
FROM library
GROUP BY 1
) l USING (id)
HAVING count(*) > 70;
与提供的其他答案一样,通常是最快的选择 - 获取 一个获胜者。
获取 所有获奖者:
ORDER BY count(*) DESC LIMIT 1
在此使用window function rank()
(不是SELECT b.id, b.name, l.ct
FROM books b
JOIN (
SELECT staff AS id, count(*) AS ct
, rank() OVER (ORDER BY count(*) DESC) AS rnk
FROM library
GROUP BY 1
) l USING (id)
WHERE l.rnk = 1;
)
请注意,您可以将聚合函数和窗口函数组合在一个row_number()
: