2017-02-09 5 views
3

ムービー評価でグループ化されたサンプルテーブルの異なる基準に基づいてカウントを単純に分割しようとしています。私はデフォルトでMySQLに付属のサンプルSAKILAスキーマを使用しています。LEFT JOINが必要ですか? WHERE条件はINNER JOINと同様に動作します

あなたは、私がこれらの最初の2つのクエリから見て期待してい別々のカウントを見ることができます:

FIRST QUERY:

SELECT f1.rating, count(f1.title) 
FROM sakila.film f1 
WHERE f1.title like '%BA%' 
GROUP BY rating 
ORDER BY rating ASC 

FIRSTクエリ結果:

rating count(f1.title) 
    G  4 
    PG  5 
    PG-13 8 
    R  6 
    NC-17 6 

SECOND QUERY:

SELECT f1.rating, count(f1.title) 
FROM sakila.film f1 
WHERE f1.title like '%AM%' 
GROUP BY rating 
ORDER BY rating ASC 

のSECONDクエリ結果:

rating count(f1.title) 
    G  8 
    PG  6 
    PG-13 9 
    R  18 
    NC-17 7 

Gの評価などPGの評価は5/6の部門を持っているため、4/8の部門を持っている、とするために私は何をした後だことです。

LEFT JOINは、この2つのWHERE条件が「BA」と「AM」の両方を含む1つのムービーになるため、私にはこの計算を実行することを期待していましたが、LEFT JOINはINNER JOINとして動作しているようです」、結果はそれが何であるかである理由である:

問題QUERY:

SELECT f1.rating, count(f1.title)/count(f2.title) 
FROM sakila.film f1 
LEFT JOIN sakila.film f2 
ON f1.film_id = f2.film_id 
WHERE f1.title like '%BA%' 
AND f2.title like '%AM%' 
GROUP BY rating 
ORDER BY rating ASC 

問題のあるクエリ結果:

rating count(f1.title)/count(f2.title) 
    PG-13 1.0000 

どのように私はMODIすることができます最初の2つのクエリからのカウントを意図したとおりに除算し、レーティングでグループ化する問題のあるクエリを実行しますか?この場合、UNION ALLを使用してクエリを書き直す必要がありますか、LEFT JOINを使用することはできますか?

ありがとうございます。やってあなたの現在のアプローチ私が間違った方向になると思い自己参加

SELECT rating, 
     SUM(CASE WHEN title LIKE '%BA%' THEN 1 ELSE 0 END)/
     SUM(CASE WHEN title LIKE '%AM%' THEN 1 ELSE 0 END) AS the_ratio 
FROM sakila.film 
GROUP BY rating 
ORDER BY rating ASC 

注:

答えて

3

あなたはここで、条件付き集約を使用することができます。代わりに、テーブル全体を1回スキャンするだけで、各ratingグループのさまざまなタイトルを数えることができます。

+0

にカウントされません選択

の最初の列は素晴らしい作品そんなに高速応答のためと説明 –

+0

に感謝を意味し、こんにちは、シドニー、コメントとしてここに貼り付けるのではなく、新しい質問を開いてください。 –

+0

ありがとう:ありがとう: http://stackoverflow.com/questions/42130476/calculating-acceptance-ratio-with-left-join-and-self-join-and-aggregate-function –

1

あなたは参加する必要はありません。 1による1/ORDER BY

SELECT 
    rating, 
    count(if (title like '%BA%', 1, null))/count(if (title like '%AM%', 1, null)) 
FROM sakila.film 
GROUP BY 1 
ORDER BY 1 

グループでは、カウントは任意のnull値

+0

ありがとう、ありがとう高速応答 –