2012-08-30 100 views
1

我有一个包含电影,演员和导演表的电影数据库。每部电影在电影表中占据一行。几乎我所有的查询都需要连接到其他表,因此带有LIMIT 50,offset 0的查询将返回大约4部电影的完整数据。以下是一个示例查询。我如何修改这个以确保正确地获取10部电影的数据?SQL:控制返回多少条记录

SELECT movie.id, movie.title, star.name, star.name_url, dir.name, 
     dir.name_url, genre.name, genre.name_url 
FROM movie 
     LEFT JOIN actor 
      ON (movie.id = actor.movie_id) 
     LEFT JOIN person AS star 
      ON (actor.person_id = star.id) 
     LEFT JOIN director 
      ON (movie.id = director.movie_id) 
     LEFT JOIN person AS dir 
      ON (director.person_id = dir.id) 
     LEFT JOIN genre_classification 
      ON (movie.id = genre_classification.movie_id) 
     LEFT JOIN genre 
      ON (genre_classification.genre_id = genre.id) 
WHERE (movie.id > 0) 
ORDER BY movie.id 
LIMIT 50 OFFSET 0; 

我正在使用PostgresSQL,这可能无所谓。

回答

3

你去那里(未经测试):

SELECT movie.id, movie.title, star.name, star.name_url, dir.name, 
     dir.name_url, genre.name, genre.name_url 
FROM 
     (SELECT * FROM movie WHERE movie.id > 0 ORDER BY movie.id LIMIT 10) movie 
     LEFT JOIN actor 
      ON (movie.id = actor.movie_id) 
     LEFT JOIN person AS star 
      ON (actor.person_id = star.id) 
     LEFT JOIN director 
      ON (movie.id = director.movie_id) 
     LEFT JOIN person AS dir 
      ON (director.person_id = dir.id) 
     LEFT JOIN genre_classification 
      ON (movie.id = genre_classification.movie_id) 
     LEFT JOIN genre 
      ON (genre_classification.genre_id = genre.id) 

编辑:通过把所有的条件进入子选择,你无法控制哪些源表movie数据将被用于加入。性能方面,这也应该快得多。

+0

这似乎工作。大。它也很快。谢谢!当我说可以的时候会接受。 –

1

只是为了信息,下面这个人是聪明的:它不使用SELECT *并优化性能(即使你没有问题):

SELECT movie.id, movie.title, star.name, star.name_url, dir.name, 
     dir.name_url, genre.name, genre.name_url 
FROM movie 
     LEFT JOIN actor   ON (movie.id = actor.movie_id) 
     LEFT JOIN person AS star ON (actor.person_id = star.id) 
     LEFT JOIN director  ON (movie.id = director.movie_id) 
     LEFT JOIN person AS dir ON (director.person_id = dir.id) 
     LEFT JOIN genre_classification ON (movie.id = genre_classification.movie_id) 
     LEFT JOIN genre   ON (genre_classification.genre_id = genre.id) 
     JOIN (
      SELECT id 
      FROM movie 
      WHERE (id > 0) 
      ORDER BY id 
      LIMIT 10 
     ) AS sel ON (sel.id=movie.id) 
ORDER BY movie.id; 
0

还未得到检验。

WITH 
    sub_movie AS (
    SELECT * FROM movie WHERE movie.id > 0 ORDER BY movie.id LIMIT 10 
    ) 
SELECT 
    sm.id, 
    sm.title, 
    star.name, 
    star.name_url, 
    dir.name, 
    dir.name_url, 
    genre.name, 
    genre.name_url 
FROM 
    sub_movie sm 
    LEFT JOIN actor 
     ON (movie.id = actor.movie_id) 
    LEFT JOIN person AS star 
     ON (actor.person_id = star.id) 
    LEFT JOIN director 
     ON (movie.id = director.movie_id) 
    LEFT JOIN person AS dir 
     ON (director.person_id = dir.id) 
    LEFT JOIN genre_classification 
     ON (movie.id = genre_classification.movie_id) 
    LEFT JOIN genre 
     ON (genre_classification.genre_id = genre.id) 

我劝不叫PK列id但使用my_table_id而是能够使用智能联接语法:较少的性能比TDK但更易读给出的答案明智的,子查询可以使用WITH语句来写像

LEFT JOIN director USING (director_id) 

祝你好运。