2013-11-03 15 views
2

這個問題,我發現是驅使我堅果,(編輯:),因爲我試圖達到這個沒有順序的方法。 我有一個表:max()的價值從嵌套選擇沒有ORDER BY

BookAuthors(書作者)

book  author 
------ --------- 
1  Joy McBean 
2  Marti McFly 
2  Joahnn Strauss 
2  Steven Spoilberg 
1  Quentin Toronto 
3  Dr E. Brown 

兩個,書籍和作家,是關鍵。

現在我想選擇不同「作者」的最高數量和作者數量的「書」值。 在我們的例子中,查詢應該檢索3本作者的'book'2。

book  authors 
-------- ------------ 
2   3 

我已經能夠將它們分組,並獲得作家的數量爲每本書與此查詢:

select B.book, count(B.author) as authors 
from BookAuthors B 
group by B.book 

這將導致:

book  authors 
-------- ------------- 
1    2 
2    3 
3    1 

現在我只想獲得作者人數最多的書。 這是我試過的一個查詢:

select Na.libro, Na.authors from (
    select B.book, count(B.author) as authors 
    from BookAuthors B 
    group by B.book 
    ) as Na 
where Na.authors in (select max(authors) from Na) 

select Na.libro, Na.authors from (
    select B.book, count(B.author) as authors 
    from BookAuthors B 
    group by B.book 
    ) as Na 
having max(Na.authors) 

我有點掙扎......

謝謝您的幫助。

編輯: 因爲@Sebas是那種答辯權和擴大我的問題,這裏是解決方案使用CREATE VIEW方法來我的腦海:

create view auth as 
    select A.book, count(A.author) 
    from BooksAuthors A 
    group by A.book 
; 

然後

select B.book, B.nAuthors 
from auth B 
where B.nAuthors = (select max(nAuthors) 
        from auth) 

回答

1
SELECT cnt.book, maxauth.mx 
FROM (
    SELECT MAX(authors) as mx 
    FROM 
     (
      SELECT book, COUNT(author) AS authors 
      FROM BookAuthors 
      GROUP BY book 
     ) t 
    ) maxauth JOIN 
     (
      SELECT book, COUNT(author) AS authors 
      FROM BookAuthors 
      GROUP BY book 
     ) cnt ON cnt.authors = maxauth.mx 

這種解決方案會更美觀高效,以期:

CREATE VIEW v_book_author_count AS 
    SELECT book, COUNT(author) AS authors 
    FROM BookAuthors 
    GROUP BY book 
; 

然後:

SELECT cnt.book, maxauth.mx 
FROM (
    SELECT MAX(authors) as mx 
    FROM v_book_author_count 
    ) maxauth JOIN v_book_author_count AS cnt ON cnt.authors = maxauth.mx 
; 
+0

嗨!這不是爲了這個問題的目的,但我很好奇現在看到它! – Edoardoo

+0

b.book還沒有定義 – Edoardoo

+0

@Edoardoo我糾正了tipo。告訴我它是否有效 – Sebas

0
select book, max(authors) 
from (select B.book, count(B.author) as authors 
    from BookAuthors B group by B.book) 
table1; 

我無法嘗試這個,因爲我沒有與我的MySQL ...你試着讓我知道...

+0

什麼是table1的? – Edoardoo

+0

** table1 **是給派生表的別名。 – Rock

+0

好吧,這會選擇第一本書和作者的最大價值,而不是與本書有關的必要。 – Edoardoo

0
SELECT book b, COUNT(author) c 
FROM BookAuthors 
GROUP BY b 
ORDER BY c DESC LIMIT 1; 
+0

我編輯了這個問題,添加'no order by'約束,因爲它在資源方面非常昂貴(它需要首先排序整個表) – Edoardoo

+0

即使使用「LIMIT 1」? –

+0

是的,事實上它首先排序整個表格,然後將輸出限制爲一個。 – Edoardoo