MySQL:使用 COUNT() 从子查询中选择 MAX()

Chr*_*ark 4 mysql sql aggregate-functions

在将其标记为重复之前,请查看此SQLFiddle

我有这个架构:

CREATE TABLE book(book_id int,
                   book_name varchar(100),
                   author_id int,
                   editor_id varchar(100),
                   isbn varchar(100));
INSERT INTO book
VALUES
(1 , 'Book1 Title' ,  12  ,  'Editor1'   , '8000-9000' ),
(2 , 'Book2 Title' ,  98  ,  'Editor1'   , '8000-9001' ),
(1 , 'Book1 Title' ,  12  ,  'Editor1'   , '8000-9002' ),
(3 , 'Book3 Title' ,  3  ,  'Editor1'   , '8000-9003' );

CREATE TABLE author(author_id int,
                    fn varchar(100),
                    ln varchar(100));
INSERT INTO author
VALUES
(12, 'name1','lname1'),
(98,'name2','lname2'),
(3,'name3','lname3');
Run Code Online (Sandbox Code Playgroud)

子查询:

  SELECT c.author_id,COUNT(*) book_count FROM book c
  GROUP BY c.author_id
Run Code Online (Sandbox Code Playgroud)

有一个结果:

| AUTHOR_ID | BOOK_COUNT |
--------------------------
|         3 |          1 |
|        12 |          2 |
|        98 |          1 |
Run Code Online (Sandbox Code Playgroud)

现在,这里棘手的部分是这个查询的结果:

SELECT MAX(book_count),a.* FROM
author a,(
  SELECT c.author_id,COUNT(*) book_count FROM book c
  GROUP BY c.author_id
) b 
where a.author_id = b.author_id
Run Code Online (Sandbox Code Playgroud)

这是:

| MAX(BOOK_COUNT) | AUTHOR_ID |    FN |     LN |
------------------------------------------------
|               2 |         3 | name3 | lname3 |
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

| MAX(BOOK_COUNT) | AUTHOR_ID |    FN |     LN |
------------------------------------------------
|               2 |        12 | name1 | lname1 |
Run Code Online (Sandbox Code Playgroud)

您认为查询中有什么问题?

him*_*056 6

相反,MAX()您可以简单地使用LIMIT它。也可以代替使用JOIN

SELECT book_count,a.author_id,a.fn, a.ln 
FROM author a
JOIN
(
  SELECT c.author_id,COUNT(*) book_count FROM book c
  GROUP BY c.author_id
) b 
ON a.author_id = b.author_id
ORDER BY book_count DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

输出:

| BOOK_COUNT | AUTHOR_ID |    FN |     LN |
-------------------------------------------
|          2 |        12 | name1 | lname1 |
Run Code Online (Sandbox Code Playgroud)

请参阅此 SQLFiddle


编辑:

如果你想使用MAX()它,你必须使用像这样的子查询:

SELECT book_count,a.author_id,a.fn, a.ln 
FROM author a
JOIN
(
  SELECT c.author_id,COUNT(*) book_count FROM book c
  GROUP BY c.author_id
) b 
ON a.author_id = b.author_id
WHERE book_count = 
        (SELECT MAX(book_count)
        FROM
        (
           SELECT c.author_id,COUNT(*) book_count FROM book c 
           GROUP BY c.author_id
        ) b )
Run Code Online (Sandbox Code Playgroud)

请参阅此 SQLFiddle


编辑2:

LIMIT您也可以简单地在内部查询中使用它,而不是在外部查询中使用它:

SELECT book_count,a.author_id,a.fn, a.ln 
FROM author a
JOIN
(
  SELECT c.author_id,COUNT(*) book_count FROM book c
  GROUP BY c.author_id
  ORDER BY COUNT(*) DESC LIMIT 1
) b 
ON a.author_id = b.author_id
Run Code Online (Sandbox Code Playgroud)

请参阅此 SQLFiddle