0

そのため、私は MySQL を初めて使用し、少し問題を抱えています。book_genres と呼ばれる 1 つのテーブルと、books と呼ばれる別のテーブルがあります。

book_genres
+-------+---------+
|book_id|  genre  |
+-------+---------+
| 1     | Horror  |
| 1     | Comedy  |
| 2     | Romance |
| 2     | Comedy  |
+-------+---------+

books
+-------+---------+
|book_id|  title  |
+-------+---------+
| 1     | A Book  |
| 2     | B Book  |
| 3     | C Book  |
+-------+---------+

次のコマンドを使用して、選択した 3 つのジャンルを持つすべての book_id を取得しています。

SELECT DISTINCT a.book_id, b.genre AS genre1, c.genre AS genre2, d.genre AS genre3 
FROM book_genres a 
JOIN book_genres b ON a.book_id = b.book_id AND b.genre LIKE 'Romance' 
JOIN book_genres c ON a.book_id = c.book_id AND c.genre LIKE 'Action' 
JOIN book_genres d ON a.book_id = d.book_id AND d.genre LIKE 'Comedy' 
GROUP BY book_id

私がやりたいことは、この検索で​​見つかった book_ids を使用して、books テーブルからすべての本のタイトルを取得することです。これを行うためのより簡単な方法があるかどうかはわかりませんが、これが私が思いついたすべてです。

助けてくれる人に感謝します!

4

3 に答える 3

1

これはより良いアプローチかもしれないと思います:

select b.*
from books b join
     book_genres bg
     on b.bookid = bg.bookid
where bg.genre in ('Romance', 'Action', 'Comedy')
group by b.book_id

これにより、3 つのジャンルのいずれかを持つすべての本が選択されます。ジャンル間で「または」または「および」のどちらが必要かについてのクエリが不明であるため、「または」と仮定しました。

group by は、"Hidden Columns" と呼ばれる MySQL の機能を使用します。この場合、distinct のように機能します。

3 つのジャンルすべてを含むすべての本が必要な場合は、次の方法で行うことができます。

select b.*
from books b join
     (select book_id
      from book_genre
      group by book_id
      having max(case when genre = 'Romance' then 1 else 0 end) > 0 and
             max(case when genre = 'Action' then 1 else 0 end) > 0 and
             max(case when genre = 'Comedy' then 1 else 0 end) > 0
     ) allg
     on b.book_id = allg.book_id
于 2012-09-24T21:44:23.017 に答える
0

さて、あなたは迅速で汚い答えが

SELECT DISTINCT a.book_id, a.book_title,
b.genre AS genre1, c.genre AS genre2, d.genre AS genre3 
FROM book_genres a 
JOIN book_genres b ON a.book_id = b.book_id AND b.genre = 'Romance' 
JOIN book_genres c ON a.book_id = c.book_id AND c.genre = 'Action' 
JOIN book_genres d ON a.book_id = d.book_id AND d.genre = 'Comedy' 
GROUP BY book_id

のように入れ替え=ワイルドカードを使用していないので見る

これを行う方法は他にもいくつかあると思いますが、どれもあなたの努力ほど簡単に理解できるものではなく、パフォーマンスがこれ以上良くなるとは思えないので、パフォーマンスが恐ろしくて対処できない場合を除きます。 book_genresのジャンル列のインデックス、個人的にはこれに固執します。

于 2012-09-24T22:03:54.973 に答える
0

次のようにサブクエリを実行できます。

SELECT books.title

FROM books

WHERE books.book_id 
IN (
SELECT 
    a.book_id

FROM 
    book_genres a 
    JOIN book_genres b ON a.book_id = b.book_id AND b.genre LIKE 'Romance' 
    JOIN book_genres c ON a.book_id = c.book_id AND c.genre LIKE 'Action' 
    JOIN book_genres d ON a.book_id = d.book_id AND d.genre LIKE 'Comedy' 

GROUP BY book_id
)
于 2012-09-24T21:44:49.000 に答える