[英]MySQL: Select MAX() from sub-query with COUNT()
在將此標記為重復之前,請查看此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');
子查詢:
SELECT c.author_id,COUNT(*) book_count FROM book c
GROUP BY c.author_id
得到一個結果:
| AUTHOR_ID | BOOK_COUNT |
--------------------------
| 3 | 1 |
| 12 | 2 |
| 98 | 1 |
現在,這里棘手的部分是這個查詢的結果:
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
這是:
| MAX(BOOK_COUNT) | AUTHOR_ID | FN | LN |
------------------------------------------------
| 2 | 3 | name3 | lname3 |
這應該是這樣的:
| MAX(BOOK_COUNT) | AUTHOR_ID | FN | LN |
------------------------------------------------
| 2 | 12 | name1 | lname1 |
您認為查詢中有什么問題?
您可以簡單地使用LIMIT
代替MAX()
。 也可以使用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
輸出:
| BOOK_COUNT | AUTHOR_ID | FN | LN |
-------------------------------------------
| 2 | 12 | name1 | lname1 |
編輯:
如果你想使用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 )
EDIT2:
您可以在內部查詢中使用LIMIT
,而不是在外部查詢中使用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
實際上,MySQL缺乏對SQL標准的支持,因為它允許使用帶有GROUP BY子句的聚合函數並在結果中返回隨機數據。 您應該以這種方式避免使用聚合。
編輯:我的意思是,例如在MySQL中你可以像這樣執行查詢:
SELECT
MAX(a), b, c
FROM
table
GROUP BY
b;
它返回c列中的隨機數據,這非常錯誤。
我想知道這個查詢正在運行,你使用聚合函數而不使用group by。 當您需要識別具有最大角落數的用戶時請嘗試
SELECT (book_count),b.author_id FROM
author a
INNER JOIN
(
SELECT c.author_id,COUNT(*) book_count FROM book c
GROUP BY c.author_id) B
ON
a.author_id = b.author_id
having book_count=MAX(book_count)
如果有效,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.