2015-10-05 46 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嵌套計數似乎是這裏的問題