簡體   English   中英

SQL-比較兩行兩列

[英]SQL - Comparing two rows and two columns

我正在研究SQL,但似乎找不到此練習的答案。

練習:對於同一位審閱者兩次對同一部電影進行評級並第二次給予更高評級的所有情況,請返回審閱者的姓名和電影標題。

我不知道如何比較2行,然后獲得更高的評分。

表的架構為:

  • 電影(mID,標題,年份,導演)英語:有一部電影,其ID號為mID,標題,發行年份和導演。
  • 審稿人(rID,name)英文:ID號為rID的審稿人具有特定名稱。
  • 評分(rID,mID,星級,ratingDate)英語:審閱者rID在特定的ratingDate上給電影mIDa評分星級(1-5)。*

到目前為止,我已經在論壇上進行了研究:

select *
from rating a
join Reviewer rv on rv.rid = a.rid
where 1 < (select COUNT(*) from rating b
            where b.rid = a.rid and b.mid = a.mid)

我很高興能得到代碼的解釋。 因為即使上面的代碼也讓我非常困惑。

/* 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 rev.name, m.title
FROM Reviewer rev
INNER JOIN Rating r1 on r1.rID = rev.rID
INNER JOIN Rating r2 on r2.rID = rev.rID and r2.mID = r1.mID
INNER JOIN Movie m on m.mID = r1.mID
WHERE r2.ratingDate > r1.ratingDate and r2.stars > r1.stars 

或者在這種情況下,您可以全部執行join(而不是WHERE子句)

SELECT rev.name, m.title
FROM Reviewer rev
INNER JOIN Rating r1 on r1.rID = rev.rID
INNER JOIN Rating r2 
  on r2.rID = rev.rID 
  and r2.mID = r1.mID
  and r2.ratingDate > r1.ratingDate
  and r2.stars > r1.stars
INNER JOIN Movie m on m.mID = r1.mID

SqlFiddle (帶有您的示例數據)

說明:我想您知道JOIN語法,所以

訣竅是兩次加入Rating。 然后,WHERE部分檢查是否存在一行,其中一個評分(來自同一電影的同一位審閱者)具有一個更大的ratingDate和更多的星星。 哪個檢查:“第二次給它更高的評價”。

然后,我們僅按reviewerName和電影標題進行分組(如果我們有3條評論,則該部分是避免重復,第二條具有比第一條更多的星星,第三條比第二條更多的星星):使用您的示例數據,需要,但是...

首先讓所有審閱過兩次的審稿人開始:

select rid
from rating r
group by rid
having count(*) = 2

現在的問題是:它們是相同的還是第二個更大? 為此,請重新加入評分,但還要包括兩個日期:

from (select rid, min(ratingdate) as minratingdate, max(ratingdate) as maxratingdate
      from rating r
      group by rid
      having count(*) = 2
     ) twotimes join
     rating r1
     on r1.rid = twotimes.rid and r1.ratingdate = twotimes.minratingdate join
     rating r2
     on r2.rid = twotimes.rid and r2.ratingdate = twotimes.maxratingdate

這帶來了有關兩個評論的信息。 您可以從這里完成查詢。

您可以使用GROUP BYHAVING

SELECT m.mId, m.Title, r.Name, ra.stars
FROM Movie m 
   JOIN (SELECT mId, rId, MAX(stars) stars
        FROM Rating 
        GROUP BY mId, rId
        HAVING COUNT(*) > 1) ra ON m.mId = ra.mId
   JOIN Reviewer r ON ra.rId = r.rId
GROUP BY m.mId, m.Title, r.Name, ra.stars

這將為您返回具有來自同一評論者的最高星數的多個評論的電影。

這是用於測試的SQL Fiddle

祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM