我正在处理数据库作业问题。它要求数据按降序排列。但是,由于多对多关系,我在查询中使用了交集。
流派的模式为
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语句的末尾不起作用(输出仍处于混乱状态)。
答案 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];
但是我不完全知道你想做什么。您的查询对我来说似乎很奇怪。为什么首先相交?