0

状況: テーブル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 の組み合わせで、多対多の結果で行数が乗算されないようにするものはありますか?

4

2 に答える 2

1

グループ化して最大にすることが必要です。

于 2010-09-20T18:07:50.977 に答える
0

2 番目の結果セットが間違っているようです:

1       | Dune: The… | 1        | Military    | 1         | Brian Herbert
1       | Dune: The… | 4        | Sci-Fi      | 2         | Kevin J Anderson

あなたが望むものをほとんど意味することはできません。結果セットを希望どおりに表現してみてください。おそらく、探しているステートメントを構築できるでしょう。あなたがそれを適切に表現できなければ、人々はこの質問に答えるのに苦労するだろうし、少なくとも私はそうするだろう.

于 2010-09-20T18:15:21.637 に答える