0

質問:

1つの列の結果を2つのselectステートメントの別の列の結果とどのように比較(<または>)しますか?

詳細:

完売した映画のリストだけを入手する必要があります。これを行うには、最初のselectステートメントのrented_movie_countの数値が、2番目のselectステートメントのavailable_movie_countの数値以上であるかどうかを確認する必要があります。


最初のステートメント

result of the 
select MOVIE_ID, count(MOVIE_ID) as rented_movies_count
from MOVIE_QUEUE
WHERE STATUS_ID=2
group by MOVIE_ID;


2番目のステートメント

select MOVIE_ID, count(MOVIE_ID) as available_movie_count
from dvd
group by MOVIE_ID;



私はまだこれに非常に慣れていないので、学習しようとしています。どのような構文(演算子、式など)を使用すべきかについての提案でさえ、少なくとも、より多くの研究を行うための方向性を示すのに役立ちます。前もって感謝します

4

1 に答える 1

1

データベース構造を考えると、考えられる解決策は次のようになります。

SELECT rented.MOVIE_ID
      ,rented_movies_count
      ,available_movie_count
  FROM (
        SELECT MOVIE_ID, count(MOVIE_ID) AS rented_movies_count
          FROM MOVIE_QUEUE
         WHERE STATUS_ID=2
        GROUP BY MOVIE_ID
       ) rented
     ,(SELECT MOVIE_ID, count(MOVIE_ID) AS available_movie_count
         FROM dvd
       GROUP BY MOVIE_ID
      ) available
 WHERE rented.movie_id = available.movie_id
   AND rented_movies_count >= available_movie_count 
;

テスト用にhttp://www.sqlfiddle.com/#!4/3fc59/11に例を設定しました。しかし、それは多かれ少なかれあなたが思いついたものだと思います。

しかし、私はあなたのデータベース構造が本当に最適であるとは少し疑っています!?1つのレコードの複数のレコードをmovie_idテーブルに実際に保存しますdvdか?

movie_idいくつかの映画の属性とdvd一緒に1つのレコードを1つだけ持っていて、DVDのレンタルステータスをに保存する方が便利ではmovie_queue.status_idないでしょうか。

movie_queue.status_idと定義されている場合

  1. ...利用可能
  2. ...レンタル

そうすれば、クエリははるかに簡単になります。

SELECT MOVIE_ID
      ,count(case when status_id = 1 then 1 end) AS available_movie_count
      ,count(case when status_id = 2 then 1 end) AS rented_movies_count
  FROM MOVIE_QUEUE
 GROUP BY MOVIE_ID
HAVING count(case when status_id = 2 then 1 end) >= count(case when status_id = 1 then 1 end)
;

たとえば、http://www.sqlfiddle.com/#!4/13739/1を参照してください。

于 2012-07-21T16:18:09.153 に答える