2015-10-05 69 views
2

我有两个表,Writer和Books。作家可以制作许多书籍。我想让所有全部作家谁生产最大数量的书籍。SQL查询:拥有number = max(number)不起作用

首先,我的sql查询是这样的:

 SELECT Name FROM(
     SELECT Writer.Name,COUNT(Book.ID) AS NUMBER FROM Writer,Book 
     WHERE 
      Writer.ID=Book.ID 
     GROUP BY Writer.Name 
     ) 
     WHERE NUMBER=(SELECT MAX(NUMBER) FROM 
         (SELECT Writer.Name,COUNT(Book.ID) AS NUMBER FROM Writer,Book 
         WHERE Writer.ID=Book.ID 
         GROUP BY Writer.Name 
     ) 

它的工作原理。不过,我认为这个查询太长,并且存在一些重复。我想让这个查询更短。所以,我尝试另一个这样的查询:

SELECT Name FROM(
     SELECT Writer.Name,COUNT(Book.ID) AS NUMBER FROM Writer,Book 
     WHERE 
      Writer.ID=Book.ID 
     GROUP BY Writer.Name 
     HAVING NUMBER = MAX(NUMBER) 
     ) 

然而,这HAVING子句不工作,我的sqlite的说,它的错误。 我不知道为什么。任何人都可以向我解释?谢谢!

+0

你应该学会在查询中使用明确的'JOIN'语法。 –

回答

1

每个查询都为您提供了聚集的一个水平,所以在同一个查询你不能COUNT使用Max。你需要一个像你在第一个查询中做的子查询。

然而,第一个查询可以在MySQL简化为:

SELECT Writer.Name 
FROM Writer, Book 
WHERE Writer.ID = Book.ID 
GROUP BY Writer.Name 
HAVING COUNT(Book.ID) = (SELECT COUNT(Book.ID) AS n 
         FROM Writer, Book 
         WHERE Writer.ID = Book.ID 
         GROUP BY Writer.Name 
         ORDER BY n DESC 
         LIMIT 1) 
+0

谢谢。但我认为它是按数字降序排列的,对吧? – JqGoo

+0

当然可以。更新了答案。 –

3

HAVING子句提供对最终集合(通常在一个group by之后)的过滤,并且不提供其他分组功能。想想它就像是一个WHERE子句,但可以在GROUP BY之后应用。

您对HAVING NUMBER = MAX(NUMBER)的查询意味着对所有记录中的NUMBER值集合进行分组,并且在此示例中没有任何意义(即使我们都获得了您想要的结果)。

1

在MySQL(但不是SQLite)中,您可以使用变量来减少工作量并进行更简单的查询。不过,也有细微差别存在,因为group by变量需要子查询的额外级别:

SELECT name 
FROM (SELECT t.*, (@m := if(@m = 0, NUMBER, @m)) as maxn 
     FROM (SELECT w.Name, COUNT(b.ID) AS NUMBER 
      FROM Writer w JOIN 
       Book b 
       ON w.ID = b.ID 
      GROUP BY w.Name 
      ) t CROSS JOIN 
      (SELECT @m := 0) params 
     ORDER BY NUMBER desc 
    ) t 
WHERE maxn = number; 
0

它看起来像你嵌套聚合函数,这是不允许的。

HAVING NUMBER = MAX(NUMBER)就像是有COUNT(Book.ID)= MAX(COUNT(Book.ID))

内MAX嵌套计数似乎是这里的问题