状況: テーブルbookは、 _author_bookテーブルを介して1 人以上の著者に関連付けられています。また、 _book_genreテーブルを介して1 つ以上のジャンルに関連付けられています。
すべての本、すべてのジャンル、およびすべての著者を選択すると、返される行数は次のようになります (各本に少なくとも 1 つのジャンルと著者があると仮定します)。
- 問題: books.map( |book| book.genres.size * book.authors.size).sum
私が欲しいのは:
- 望ましい: books.map( |book| [book.genres.size, book.authors.size].max).sum
したがって、10 冊の本が与えられた場合、各本には 5 つのジャンルと 4 人の著者が含まれます。
- 問題: 200 行が返される (5 * 4 * 10)
- 望ましい: 50 行が返される ( [5,4].max * 10 )
サンプルデータ:
mysql> SELECT * FROM 本 ID | 題名 --+------------------------------------- 1 | 砂丘: バトラリアン ジハード 2 | タリスマン mysql> SELECT * FROM ジャンル ID | 題名 --+------------- 1 | 軍隊 2 | ホラー 3 | スリラー 4 | SF 5 | フィクション 6 | 投機的 mysql> SELECT * FROM 作者 ID | 題名 --+-------------------- 1 | ブライアン・ハーバート 2 | ケビン・J・アンダーソン 3 | スティーブン・キング 4 | ピーター・ストラウブ mysql> SELECT * FROM _author_book book_id | author_id ------+----------- 1 | 1 1 | 2 2 | 3 2 | 4 mysql> SELECT * FROM _book_genre book_id | ジャンル_id ------+----------- 1 | 1 1 | 4 1 | 5 1 | 6 2 | 2 2 | 3 2 | 5
ここに問題があります:
mysql> SELECT book.id AS "book.id", ..., author.fullname AS "author.fullname" FROM book -> LEFT JOIN _book_genre ON book.id = _book_genre.book_id -> LEFT JOIN ジャンル ON ジャンル.id = _book_genre.genre_id -> LEFT JOIN _author_book ON book.id = _author_book.book_id -> LEFT JOIN author ON author.id = _author_book.author_id; book.id | book.title | ジャンル.id | ジャンル名 | 著者.id | 著者.フルネーム ------+------------+----------+-------------+-- ------+------------------ 1 | 砂丘: その… | 1 | 軍事 | 1 | ブライアン・ハーバート 1 | 砂丘: その… | 4 | サイエンス フィクション | 1 | ブライアン・ハーバート 1 | 砂丘: その… | 5 | フィクション | フィクション 1 | ブライアン・ハーバート 1 | 砂丘: その… | 6 | 投機的 | 1 | ブライアン・ハーバート ------+------------+----------+-------------+-- ------+------------------ 1 | 砂丘: その… | 1 | 軍事 | 2 | ケビン・J・アンダーソン 1 | 砂丘: その… | 4 | サイエンス フィクション | 2 | ケビン・J・アンダーソン 1 | 砂丘: その… | 5 | フィクション | フィクション 2 | ケビン・J・アンダーソン 1 | 砂丘: その… | 6 | 投機的 | 2 | ケビン・J・アンダーソン ------+------------+----------+-------------+-- ------+------------------ 2 | タリス… | 2 | ホラー | ホラー 3 | スティーブン・キング 2 | タリス… | 3 | スリラー | 3 | スティーブン・キング 2 | タリス… | 5 | フィクション | フィクション 3 | スティーブン・キング ------+------------+----------+-------------+-- ------+------------------ 2 | タリス… | 2 | ホラー | ホラー 4 | ピーター・ストラウブ 2 | タリス… | 3 | スリラー | 4 | ピーター・ストラウブ 2 | タリス… | 5 | フィクション | フィクション 4 | ピーター・ストラウブ
うまくいけば、問題が何であるかが明確になります。ジャンル/_book_genre での最初の結合の結果は、すべての著者の結果と結合され、14 行の結果セットになりますが、実際には7行のみの結果セットで十分です。
book.id | book.title | ジャンル.id | ジャンル名 | 著者.id | 著者.フルネーム ------+------------+----------+-------------+-- ------+------------------ 1 | 砂丘: その… | 1 | 軍事 | 1 | ブライアン・ハーバート 1 | 砂丘: その… | 4 | サイエンス フィクション | 2 | ケビン・J・アンダーソン 1 | 砂丘: その… | 5 | フィクション | フィクション 1 | ブライアン・ハーバート 1 | 砂丘: その… | 6 | 投機的 | 2 | ケビン・J・アンダーソン ------+------------+----------+-------------+-- ------+------------------ 2 | タリス… | 2 | ホラー | ホラー 3 | スティーブン・キング 2 | タリス… | 3 | スリラー | 4 | ピーター・ストラウブ 2 | タリス… | 5 | フィクション | フィクション 3 | スティーブン・キング
(または、重複した著者は NULL 値である可能性がありますが、そこに答えがある場合は、上記のように著者が繰り返されると想定しています)。
私の質問: LEFT、RIGHT、INNER、OUTER、ABAB SELECT START の組み合わせで、多対多の結果で行数が乗算されないようにするものはありますか?