4

これを重複としてマークする前に、この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 |

クエリの何が間違っていると思いますか?

4

3 に答える 3

4

代わりに、単に同じものを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

出力:

| BOOK_COUNT | AUTHOR_ID |    FN |     LN |
-------------------------------------------
|          2 |        12 | name1 | lname1 |

この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 )

この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

このSQLFiddleを参照してください

于 2013-08-05T06:27:10.190 に答える
1

実際、MySQL は SQL の標準をサポートしていません。これは、GROUP BY 句なしで集計関数を使用でき、結果にランダム データを返すためです。このように集計を使用することは避けてください。

編集: たとえば、MySQL では、次のようにクエリを実行できます。

SELECT
  MAX(a), b, c
FROM
  table
GROUP BY
  b;

これは c 列にランダムなデータを返しますが、それはひどく間違っています。

于 2013-08-05T06:33:08.437 に答える
0

これは、このクエリが実行されていることを不思議に思っています。グループ化を使用せずに集計関数を使用しました。ヌークカウントが最大のユーザーを特定する必要がある場合は、試してください

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)

うまくいくかどうか教えてください。

于 2013-08-05T06:30:26.140 に答える