Mysql 不带排序依据的嵌套select中的max()值
我发现的这个问题快把我逼疯了,(编辑:),因为我试图在没有orderby方法的情况下实现这一点。 我有一张桌子: 书籍作者(书籍,作者) 书和作者都是关键 现在我想选择不同“作者”数量最多的“书籍”值,以及作者数量。 在我们的例子中,查询应该检索包含3位作者的“book”2Mysql 不带排序依据的嵌套select中的max()值,mysql,sql,nested,subquery,Mysql,Sql,Nested,Subquery,我发现的这个问题快把我逼疯了,(编辑:),因为我试图在没有orderby方法的情况下实现这一点。 我有一张桌子: 书籍作者(书籍,作者) 书和作者都是关键 现在我想选择不同“作者”数量最多的“书籍”值,以及作者数量。 在我们的例子中,查询应该检索包含3位作者的“book”2 book authors -------- ------------ 2 3 我已经能够通过此查询对它们进行分组并获得每本书的作者数量: select B.book, count(B.a
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)
及
我有点挣扎
谢谢你的帮助
编辑:
由于@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)
我不能尝试这个,因为我没有mysql和我在一起。。。你试着让我知道
SELECT book b, COUNT(author) c
FROM BookAuthors
GROUP BY b
ORDER BY c DESC LIMIT 1;
该解决方案将更美观、更高效,并具有以下优点:
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
;
我编辑了添加“no order by”约束的问题,因为即使使用“LIMIT 1”,它在资源方面也非常昂贵(需要先订购整个表)?是的,事实上,它首先订购整个表,然后将输出限制为一。嗨!这不是问题的目的,但我现在很想看看!b、 这本书并没有被定义,你们只是忘记了引用第三级select(它在mySql上检索错误),但这是一个非常好的答案。非常感谢。@Edoardoo添加视图选项我刚刚添加了另一个版本的创建视图实现。table1是为派生表指定的别名。好的,这将选择第一本书和作者的最大值,与该书无关。很抱歉回答错误。我试过这个问题,结果一如你所说。我找到的解决方案与@Sebas在回答的第一部分中所写的非常接近。
SELECT book b, COUNT(author) c
FROM BookAuthors
GROUP BY b
ORDER BY c DESC LIMIT 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
;