MYSQL 查询、集合论和大于
MYSQL queries, set theory and greater than
我有一个数据库,其中有 2 个表,一个用于奖项,一个用于电影。
Table 电影具有评分和 (PK) 电影标题:
| title | rating
| Avatar | 5.0
| mid summer | 7.0
| terminator | 8.0
Table awards有片名(FK)、奖项、结果(获奖或提名):
|title | award | result |
|avatar | oscar | won |
|mid summer | oscar | nominated |
|terminator | bafta | nominated |
我要执行的查询是查找获得同一奖项提名的所有电影对 (m1, m2),使得 m1 具有
评分高于 m2 ,但 m2 获得了奖项。
结果应该 return:
|avatar | oscar |won | 5.0
|midsummer | oscar |nominated | 7.0
我尝试过内部连接,但每次它只会显示不同的值。改动 return 产生了错误的结果。
我试过的代码示例:
select a.award as 'Award', a.result as 'Result', m.rating as 'Average
rating', m.title as 'Movie' from awards as a
inner join movies as m
on a.title = m.title
where a.result ='won' or a.result = 'nominated'
group by a.award;
您必须加入 movies
到 awards
两次:
select m1.title, a1.award, a1.result, m1.rating
from movies m1
inner join awards a1 on a1.title = m1.title
inner join awards a2 on a2.award = a1.award and a2.result <> a1.result
inner join movies m2 on m2.title = a2.title
where case a1.result when 'won' then m1.rating else m2.rating end <
case a1.result when 'won' then m2.rating else m1.rating end
您应该添加一个 ORDER BY
子句,例如:
order by
case a1.result when 'won' then a1.title else a2.title end,
least(m1.rating, m2.rating),
greatest(m1.rating, m2.rating)
因为会返回多对行。
见 demo.
结果:
> title | award | result | rating
> :--------- | :---- | :-------- | -----:
> Avatar | oscar | won | 5
> mid summer | oscar | nominated | 7
我有一个数据库,其中有 2 个表,一个用于奖项,一个用于电影。 Table 电影具有评分和 (PK) 电影标题:
| title | rating
| Avatar | 5.0
| mid summer | 7.0
| terminator | 8.0
Table awards有片名(FK)、奖项、结果(获奖或提名):
|title | award | result |
|avatar | oscar | won |
|mid summer | oscar | nominated |
|terminator | bafta | nominated |
我要执行的查询是查找获得同一奖项提名的所有电影对 (m1, m2),使得 m1 具有 评分高于 m2 ,但 m2 获得了奖项。 结果应该 return:
|avatar | oscar |won | 5.0
|midsummer | oscar |nominated | 7.0
我尝试过内部连接,但每次它只会显示不同的值。改动 return 产生了错误的结果。 我试过的代码示例:
select a.award as 'Award', a.result as 'Result', m.rating as 'Average
rating', m.title as 'Movie' from awards as a
inner join movies as m
on a.title = m.title
where a.result ='won' or a.result = 'nominated'
group by a.award;
您必须加入 movies
到 awards
两次:
select m1.title, a1.award, a1.result, m1.rating
from movies m1
inner join awards a1 on a1.title = m1.title
inner join awards a2 on a2.award = a1.award and a2.result <> a1.result
inner join movies m2 on m2.title = a2.title
where case a1.result when 'won' then m1.rating else m2.rating end <
case a1.result when 'won' then m2.rating else m1.rating end
您应该添加一个 ORDER BY
子句,例如:
order by
case a1.result when 'won' then a1.title else a2.title end,
least(m1.rating, m2.rating),
greatest(m1.rating, m2.rating)
因为会返回多对行。
见 demo.
结果:
> title | award | result | rating
> :--------- | :---- | :-------- | -----:
> Avatar | oscar | won | 5
> mid summer | oscar | nominated | 7