0

问题:

您如何比较(< 或 >)一列的结果与两个 select 语句的另一列的结果?

更多细节:

我只需要获取已售罄电影的列表。为此,我需要检查第一个 select 语句上的rented_movie_count 上的数字是否等于或大于第二个 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;


第二个声明

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上设置了一个示例进行测试。但我想这或多或少是你想出的。

但我有点怀疑你的数据库结构真的是最优的!?movie_id你真的在表中存储了多个记录dvd吗?

将每张唱片与一些电影属性一起保存并将 DVD 的出租状态存储在movie_id其中不是更有用吗?dvdmovie_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 回答