2017-06-26 13 views
2

タイトルと著者カラムを持つMySQLデータベースに書籍のテーブルがあります。私はテーブルにX本以上の書籍を持っている著者がいるすべての本を選択する必要があります。ここでカラム値のX個以上のエントリがあるすべての行を取得

は、所望の出力の例です:

| Author  | Title    | 
|---------------|----------------------| 
| Dan Brown  | Angels and Demons | 
| Dan Brown  | The Da Vinci Code | 
| Robert Ludlum | The Bourne Identity | 
| Robert Ludlum | The Bourne Supremacy | 

私は著者ごとに一冊の本で、簡単なグループを使用して、条件を持つ得ることができます。

SELECT * FROM books 
GROUP BY author 
HAVING count(author) > 1 
ORDER BY author; 

次のような出力が得られます。

| Author  | Title    | 
|---------------|----------------------| 
| Dan Brown  | Angels and Demons | 
| Robert Ludlum | The Bourne Identity | 

著者数がX本以上ある書籍のリストを取得するにはどうすればよいですか?

答えて

2

あなたが使用することができるはず​​:

SELECT * FROM books 
WHERE author IN (
    SELECT author 
    FROM books 
    GROUP BY author 
    HAVING COUNT(author) > 1 
) 
+0

これは大量のデータでは非常に遅いです。同じ結果を得るためのより速い方法がありますか? –

+0

著者に索引がありますか? – kjones

+1

私はしませんでした。インデックス作成者はそれを大幅に高速化しました。ありがとうございました。 –

3

あなたはsub-selectとしてクエリを使用することができます。

SELECT * FROM books WHERE Author IN (
    SELECT Author 
    FROM books 
    GROUP BY Author 
    HAVING COUNT(Author) > 1 
) ORDER BY Author, Title; 

あなたは著者あたりの図書の簡単な(カンマ区切り)リストを取得したい場合は、またGROUP_CONCATを使用して、以下のソリューションを使用することができます。

SELECT Author, GROUP_CONCAT(Title) AS title_list 
FROM books 
GROUP BY Author 
HAVING COUNT(Author) > 1 
ORDER BY Author; 

デモ:http://sqlfiddle.com/#!9/10d80f/2/0

+0

Ohhはい、非常に良い それ! – kjones

+0

非常に感謝しています。 –

0

非常に単純なクエリは、これは多分に使ってみて

1

を助け希望

SELECT books.Title 
FROM (SELECT Count(books.Author) AS CountOfAuthor, books.Author AS A 
FROM books 
GROUP BY books.Author) AS bookByAuthor INNER JOIN books ON bookByAuthor.A = 
books.Author 
WHERE (((books.Author)=[bookByAuthor].[A])); 

を下回るようになります...

SELECT [Author] , [Title] 
    FROM [books] b 
    where [Author] in 
    (select Author from [books] group by [Author] 
     having count(Author) >1) 
関連する問題