2016-07-19 24 views
0

私はSQLを使い慣れていて、なかなか難しいですね。私は誰かが私のためにいくつかのものをクリアできることを望んでいます。WHERE句を使用してNull結果を表示する方法

これは私の問題です。私は、俳優が演じたカテゴリーすべてと、そのカテゴリーで演じた映画の量を表示したいと思います。例えば、彼らはアクション映画で5回プレーしています。これは、カテゴリと「ケビン・ブルーム」倍の量が、それは彼がで遊んでいませんカテゴリのNULL値を表示しませんそれぞれに果たしているとのすべてを表示します

SELECT c.name AS "Category_Name" 
     , Count(c.name) AS "Count" 
    FROM category c 
    JOIN film_category fc 
    ON c.category_id = fc.category_id 
    JOIN film f 
    ON fc.film_id = f.film_id 
    JOIN film_actor fa 
    ON f.film_id = fa.film_id 
    JOIN actor a 
    ON fa.actor_id = a.actor_id 
WHERE a.first_name = "Kevin" 
    AND a.last_name = "Bloom" 
GROUP 
    BY c.name 
ORDER 
    BY c.name ASC; 

:これは私がこれまで持っているものです私はそれが必要です。私はこれを理解しようと数時間を費やしましたが、助けにならなかったか、それを理解できませんでした。

ここからWHERE句を収集してこの問題が発生しています。私は、LEFT JOINを代わりに、おそらくサブクエリを使用する必要があると考えています。私は一緒に使用すると、これらの両方の上で少し不安定です。誰かが初心者に何か助けを与えることができれば、本当に感謝しています!あなたのコメントパー

+1

はいLEFT JOINsを実行し、where句をアクタテーブルの結合のON条件に移動します – Matt

+0

@Mattは何を言ったのですか? JOINの種類についての視覚的な説明があります:https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ – hsan

+0

はい。内部結合を左結合に変更し、WHEREをAND – Strawberry

答えて

1
SELECT c.name AS "Category_Name", Count(a.actor_id) AS "Count" 
FROM category c 
    LEFT JOIN film_category fc ON c.category_id = fc.category_id 
    LEFT JOIN film f ON fc.film_id = f.film_id 
    LEFT JOIN film_actor fa ON f.film_id = fa.film_id 
    LEFT JOIN actor a 
     ON fa.actor_id = a.actor_id 
     AND a.first_name = 'Kevin' AND a.last_name = 'Bloom' 
GROUP BY c.name 
ORDER BY c.name ASC; 

、なぜWHEREANDを使用することは実行する際にWHEREの評価方法についてです。 WHERE句は、指定した条件によって結果セット全体を制限します。 ONの条件では、レコードとの一致を許可する条件のみが制限されますが、OUTER JOINが使用されている場合は必ずしもすべての結果が設定されるとは限りません。だからWHEREの条件では、LEFT JOINRIGHT側の結果が制限され、INNER JOINとなります。これは一致する結果が欲しいだけなので、categoriesと一致するのでactorしか得られないためです。しかし、JOINON句に条件を入力することによって、結果は限定されず、すべてのカテゴリが返されますが、あなたの基準に一致する俳優だけが考慮されます。

+0

に変更してください。Hey Mattはちょうど助けてくれてありがとうございました。なぜあなたはどこに変わったのですか? – tntsgoboom

+0

ここで、ANDはアクター表のON条件の一部であることを反映しているためです。したがって、あなたの参加条件に合った結果だけがあなたに与えられます。あなたがWHEREに切り替えた場合、あなたは本質的にあなたが望まないINNER JOINと同じ結果を得るでしょう。私はより良い説明で私の答えを少し拡大しようとします – Matt

+0

ありがとう私はそれを感謝の説明のためにたくさん! – tntsgoboom

0

あなたはLEFT JOINを使用しますが、あなたは注意する必要があります:

SELECT c.name AS Category_Name, Count(a.actor_id) AS "Count" 
    FROM category c LEFT JOIN 
     film_category fc 
     ON c.category_id = fc.category_id LEFT JOIN 
     film f 
     ON fc.film_id = f.film_id LEFT JOIN 
     film_actor fa 
     ON f.film_id = fa.film_id LEFT JOIN 
     actor a 
     ON fa.actor_id = a.actor_id AND a.first_name = 'Kevin' AND a.last_name = 'Bloom' 
    GROUP BY c.name 
    ORDER BY c.name ASC; 

注:

  • LEFT JOINが解決の鍵となります。
  • actorからIDをカウントするようにCOUNT()が変更されていることに注意してください。これは、行動していないカテゴリに対して0を返します。
  • SQLの文字列の標準区切り文字は、一重引用符で、二重引用符ではありません。
  • 必要がない限り、列エイリアスをエスケープする必要はありません。
+0

お返事ありがとうございました。私があなたが書いたものを照会するとき、私は実際に私の質問が私には奇妙である同じ正確な結果を得る。どちらのクエリも、それぞれの隣に数字がある12のカテゴリのみを出力しますが、何らかの理由で最後の4つのカテゴリが出力されません。これらのカテゴリとともにヌル値がまだ失われています。 – tntsgoboom

+0

上記を無視してくださいエラーが発生しました。説明をもう一度ありがとう。 – tntsgoboom

関連する問題