交点后订购数据Postgresql

时间:2019-04-17 06:52:02

标签: postgresql

我正在处理数据库作业问题。它要求数据按降序排列。但是,由于多对多关系,我在查询中使用了交集。

流派的模式为

CREATE TABLE Genre (
movie_id integer REFERENCES Movie(id),
genre GenreType,
primary key (movie_id,genre)
);

我的代码当前为

    $genres = tokenise($argv[1], "&");
    $i = 0;
    $qry = " 
        (select m.title, m.YEAR, m.content_rating, m.lang, r.imdb_score, r.num_voted_users
        from Movie m
        join Rating r on (m.id = r.movie_id)
        join Genre g on (m.id = g.movie_id)
        where m.YEAR >= ".$startYear." 
        and m.YEAR <= ".$endYear." 
        and g.genre = '".$genres[$i]."')
        ";
    $i++;
    while ($i < count($genres)){
        $qry = $qry."
            intersect
            (select m.title, m.YEAR, m.content_rating, m.lang, r.imdb_score, r.num_voted_users
            from Movie m
            join Rating r on (m.id = r.movie_id)
            join Genre g on (m.id = g.movie_id)
            where m.YEAR >= ".$startYear." 
            and m.YEAR <= ".$endYear." 
            and g.genre = '".$genres[$i]."')
            ";
        $i++;
    }

我想用语句对最终结果进行排序

order by r.imdb_score desc, r.num_voted_users desc

但是,将其标记到每个select语句的末尾不起作用(输出仍处于混乱状态)。

2 个答案:

答案 0 :(得分:1)

一个相交(或并集或除外)最后只能有一个ORDER BY。即使“看起来”它属于最终查询,它也适用于整个结果,例如:

select m.title, m.YEAR, m.content_rating, m.lang, r.imdb_score, r.num_voted_users
from Movie m
  join Rating r on m.id = r.movie_id
  join Genre g on m.id = g.movie_id
where ...

intersect

select m.title, m.YEAR, m.content_rating, m.lang, r.imdb_score, r.num_voted_users
from Movie m
  join Rating r on m.id = r.movie_id
  join Genre g on m.id = g.movie_id
where ...

order by imdb_score desc, num_voted_users desc

将对相交的完整结果进行排序,请注意,在引用列时,您不能使用表别名(列名与第一个查询的名称相对应)。

不需要将各个查询放在括号之间。


但是开始使用intersect似乎很奇怪。

似乎您正在模拟一个简单的IN条件。据我所知,您可以将其替换为使用where ... and genre in ('genre1', 'genre2', ....)

的单个查询

这将更容易理解,也将更快。

答案 1 :(得分:0)

您仍然可以执行以下操作:

SELECT *
FROM 
(
   [Your_Entire_Query_With_All_Your_Intersects]
) T
ORDER BY [Your_Conditions];

但是我不完全知道你想做什么。您的查询对我来说似乎很奇怪。为什么首先相交?