sql - 如何获得这个特定 "query"的结果

标签 sql sqlite

注意:我不小心把另一个问题的句子放在这里(我深表歉意),我已于 3 月 14 日星期三下午 23:21 更新了这篇帖子,并提供了正确的问题。

我花了几个小时试图在没有任何人帮助的情况下弄清楚这个问题,但我意识到我浪费了太多的工作时间,应该早点问别人。我在这方面做得很好,已经很接近了,但无法得到我需要的最终解决方案。我应该得到的是:

For all cases where the same reviewer rated the same movie twice and gave it a higher rating the second time, return the reviewer's name and the title of the movie.

这是我在这里设法得到的查询:

SELECT reviewer.name, movie.title, rating.stars  
FROM (reviewer JOIN rating ON reviewer.rid = rating.rid)  
JOIN movie ON movie.mid = rating.mid  
GROUP BY reviewer.name 
HAVING COUNT(*) >= 2  
ORDER BY reviewer.name DESC

(我感觉上面的查询中缺少一个 WHERE 子句,但我不确定该放在哪里)

(据我了解,SQLite 目前不支持 RIGHT 和 FULL OUTER JOIN)

这是表格和数据(在图片中)...

Movie

Reviewer

Rating

...和数据库代码...

/* Delete the tables if they already exist */
drop table if exists Movie;
drop table if exists Reviewer;
drop table if exists Rating;

/* Create the schema for our tables */
create table Movie(mID int, title text, year int, director text);
create table Reviewer(rID int, name text);
create table Rating(rID int, mID int, stars int, ratingDate date);

/* Populate the tables with our data */
insert into Movie values(101, 'Gone with the Wind', 1939, 'Victor Fleming');
insert into Movie values(102, 'Star Wars', 1977, 'George Lucas');
insert into Movie values(103, 'The Sound of Music', 1965, 'Robert Wise');
insert into Movie values(104, 'E.T.', 1982, 'Steven Spielberg');
insert into Movie values(105, 'Titanic', 1997, 'James Cameron');
insert into Movie values(106, 'Snow White', 1937, null);
insert into Movie values(107, 'Avatar', 2009, 'James Cameron');
insert into Movie values(108, 'Raiders of the Lost Ark', 1981, 'Steven Spielberg');

insert into Reviewer values(201, 'Sarah Martinez');
insert into Reviewer values(202, 'Daniel Lewis');
insert into Reviewer values(203, 'Brittany Harris');
insert into Reviewer values(204, 'Mike Anderson');
insert into Reviewer values(205, 'Chris Jackson');
insert into Reviewer values(206, 'Elizabeth Thomas');
insert into Reviewer values(207, 'James Cameron');
insert into Reviewer values(208, 'Ashley White');

insert into Rating values(201, 101, 2, '2011-01-22');
insert into Rating values(201, 101, 4, '2011-01-27');
insert into Rating values(202, 106, 4, null);
insert into Rating values(203, 103, 2, '2011-01-20');
insert into Rating values(203, 108, 4, '2011-01-12');
insert into Rating values(203, 108, 2, '2011-01-30');
insert into Rating values(204, 101, 3, '2011-01-09');
insert into Rating values(205, 103, 3, '2011-01-27');
insert into Rating values(205, 104, 2, '2011-01-22');
insert into Rating values(205, 108, 4, null);
insert into Rating values(206, 107, 3, '2011-01-15');
insert into Rating values(206, 106, 5, '2011-01-19');
insert into Rating values(207, 107, 5, '2011-01-20');
insert into Rating values(208, 104, 3, '2011-01-02');

我有另一个类似的问题,但如果我在这个问题上得到一些帮助,我应该能够将这个问题的模式和技术应用到下一个问题。

提前致谢! :)

最佳答案

我添加了一个与派生表的内部联接,该表返回每部电影的最大明星数。由于电影和评级之间的内部连接,只有具有评级的电影才会被检索。将其连接回主查询以获得每部电影的最大星数。

注意:您声明您希望按电影名称排序,但您的查询按评论排序。

SELECT reviewer.name, movie.title, rating.stars, maxStarsPerMovie.MaxStars
FROM (reviewer JOIN rating ON reviewer.rid = rating.rid)  
JOIN movie ON movie.mid = rating.mid  
join
(
   select movie.mid, max(rating.stars) MaxStars
   from movie
   inner join rating
      on movie.mid = rating.mid
   group by movie.mid
) maxStarsPerMovie
on movie.mid = maxStarsPerMovie.mid
ORDER BY reviewer.name DESC

编辑:要求已更改。此查询将返回后来改变意见以支持该电影的评论者列表。为此,它第二次加入评级,在星级和加入日期上添加两个过滤器。

SELECT reviewer.name, movie.title, rating.ratingDate, rating.stars,
       newRating.ratingDate newRatingDate, newRating.Stars newRatingStars
FROM (reviewer JOIN rating ON reviewer.rid = rating.rid)  
JOIN movie ON movie.mid = rating.mid 
inner join rating newRating
     on newRating.mid = movie.mid
        and newRating.rid = reviewer.rid
        and newRating.ratingdate > rating.ratingdate
        and newRating.stars > rating.stars
ORDER BY reviewer.name, movie.title

关于sql - 如何获得这个特定 "query"的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9699029/

相关文章:

sql - 在 SQL 中有效地拉伸(stretch)时间序列

MySQL 触发器 : After restart present?

android - 使用 XML 填充 SQLite 并集成到 Activity 内部

Android 在 Sqlite 中按 Id 选择行?

android - 如何使用 sqlite 查询获取当前月份或指定月份的日期?

mysql - SQL 检查其他表中是否存在,如果不存在则检查其类型

MySql 替换函数 - 查找开头和结尾带有空格的特定字符串

编译C和sqlite3

android - Android Studio 中连接两列并更新到另一列的正确语法是什么

mysql - SQL 查询 UPDATE 两行被另一行过滤