1

我有以下没有错误的查询:

SELECT u.user_name, u.user_lastn, outer_s.movie_id, outer_s.times_rented
FROM users u,
    ( 
        SELECT * FROM  
        (   
            SELECT user_id, movie_id, count (movie_id) as times_rented
            FROM movie_queue 
            GROUP BY (user_id, movie_id)
            ORDER BY user_id, movie_id 
        ) inner_s
        WHERE times_rented>1
    ) outer_s    
WHERE u.user_id= outer_s.user_id;


这是它返回的内容:

USER_NAME                USER_LASTN                 MOVIE_ID TIMES_RENTED
------------------------ ------------------------ ---------- ------------
John                     Smith                             1            3 
John                     Smith                             6            2 
Mary                     Berman                            4            2 
Mary                     Berman                            6            4 
Elizabeth                Johnson                           1            2 
Peter                    Quigley                           2            2 


我仍然需要做的是显示电影的名称,而不是movie_id,但电影的名称位于另一个名为 movies 的表中,类似于以下示例:

 MOVIE_ID  MOVIE_NAME                                                
---------- ---------------------------------------------
         1 E.T. the Extra-Terrestrial    
         2 Jurassic Park                
         3 Indiana Jones and the Kingdom of the Crystal     
         4 War of the Worlds  
         5 Signs  

期望的结果:
我想在最终表中看到以下列:
USER_NAME | USER_LASTN | 电影名称| TIMES_RENTED |

问题:
但是在这么多子查询之后我很困惑,我怎样才能在那里得到电影名称而不是电影ID?

尝试:
我尝试通过将查询更改为

SELECT u.user_name, u.user_lastn, m.movie_name, outer_s.times_rented
FROM users u, movie m (etc.....)

但它返回了 120 行而不是我应该得到的 6 行。

请帮忙!!

4

3 回答 3

1
SELECT u.user_name, u.user_lastn, m.movie_name, COUNT(q.movie_id)
FROM users AS u
JOIN movie_queue AS q ON q.user_id = u.user_id
JOIN movie AS m ON m.movie_id = q.movie_id
GROUP BY u.user_name, u.user_lastn, m.movie_name
HAVING COUNT(q.movie_id) > 1
于 2012-07-23T02:07:32.467 回答
0

或者您可以使用 CTE 使您的查询可读:

WITH outer_s as (SELECT user_id, movie_id, count (movie_id) as times_rented
      FROM movie_queue 
      GROUP BY (user_id, movie_id)
      having  count (movie_id) > 1
     ) 
SELECT u.user_name, u.user_lastn, m.movie_name, outer_s.movie_id, outer_s.times_rented FROM users u join outer_s    
         on u.user_id= outer_s.user_id join
         movies m
         on outer_s.movie_id = m.move_id

使用 CTE 具有提高可读性和易于维护复杂查询的优点。查询可以分为单独的、简单的、逻辑的构建块。然后可以使用这些简单的块来构建更复杂的临时 CTE,直到生成最终结果集。

于 2012-07-23T02:06:35.427 回答
0

您只需要将查询的结果连接到另一个查询。但是,首先,我将重写查询以简化它,使用正确的连接语法:

SELECT u.user_name, u.user_lastn, m.movie_name, outer_s.movie_id, outer_s.times_rented
FROM users u join
     (SELECT user_id, movie_id, count (movie_id) as times_rented
      FROM movie_queue 
      GROUP BY (user_id, movie_id)
      having  count (movie_id) > 1
     ) outer_s    
     on u.user_id= outer_s.user_id join
     movies m
     on outer_s.movie_id = m.move_id
于 2012-07-23T01:57:37.863 回答