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_LASTN | MOVIE_NAME | TIMES_RENTED |

質問:
しかし、私は非常に混乱している多くのサブクエリの後で、movie_idの代わりにmovie_nameを取得するにはどうすればよいですか?

試行:
クエリを次のように変更して、目的の結果を取得しようとしました

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

しかし、6行ではなく120行が返されました。

助けてください!!

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

クエリの結果を他のクエリに結合する必要があります。ただし、最初に、クエリを書き直して、適切な結合構文を使用してクエリを簡略化します。

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 に答える
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 に答える