2012-03-14 28 views
4

注:我不小心把一個問題的句子在這裏(大規模的道歉對我而言),我已經更新了這個帖子週三3月14日在23:21 PM用正確的問題。如何得到這個特別的「查詢」的結果

我已經花了幾個小時試圖找出這個問題,沒有任何人的幫助,但已經意識到我浪費了太多的生產時間,應該更早地問別人。我在這方面有一個體面的裂縫,並且已經如此接近,但無法得到我需要的最終解決方案。什麼我應該得到的是:

對於在同一評論額定同一部電影兩次, 給了較高的評價,第二次返回評論者的名稱 和電影的標題所有案件。

這是我設法弄到這裏查詢:

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 

(我有一種感覺是有缺失的,其中來自上面的查詢子句,但我不知道在何處放置它)

(據我瞭解,RIGHT和FULL OUTER JOIN的不SQLite中目前支持的)

而且這裏的表和數據(圖片)...

Movie

Reviewer

Rating

...和DB代碼...

/* 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'); 

我有這樣的另一個比較類似的問題,但如果我得到一些幫助上這一個我應該能夠將這個模式和技術應用到下一個。

在此先感謝! :)

回答

5

我增加了一個內部聯接與派生表返回每部影片的最大明星。由於電影和評分之間的內部聯合,只有評級的電影纔會被檢索。將其加入主查詢中,以獲得每部電影的最大星星數。

注意:你說,你想通過電影標題,而是由審稿查詢訂單訂購。

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 
+0

歡呼的答案,雖然這是另一個問題(我最初意外地發佈了錯誤的問題,並用正確的問題更新了這篇文章)。您的反饋將有助於其他一些問題:) – Rob 2012-03-14 10:29:16

+0

@Rob我編輯了我的答案。 – 2012-03-14 23:40:31

2

從需求描述:

返回的電影標題,星星(由電影標題排序)對於有至少一個等級每部電影數量,並找到星星的數量最多那部電影收到了。

評論者的詳細信息似乎並不需要 - 只有電影和最大的星星。

因此,我建議:

SELECT movie.mid, MAX(movie.title) as title, MAX(rating.stars) as max_stars 
FROM rating 
JOIN movie ON movie.mid = rating.mid 
GROUP BY movie.mid 
ORDER BY 2, 1 
+0

感謝您的反饋:)。我可以像你對​​「尼古拉馬爾科維諾維奇」所說的那樣對你說同樣的話。道歉的混亂,雖然你的反饋將幫助我很多:)。 – Rob 2012-03-14 10:31:10

0

您可能正在爲斯坦福大學的SQL迷你課程做這個工作,就像我剛纔那樣。這就是我得到了我的答案(我看的演講之前,曾與SQL沒有經驗,所以希望這不是太可怕):

開始與發現每一個擺脫對誰額定電影兩次審閱查詢並且第二次給了它更高的分數:

select R1.rID from Rating R1, Rating R2 where R1.mID = R2.mID and R1.rID = R2.rID 
     and R1.ratingDate < R2.ratingDate and R2.stars > R1.stars; 

認爲R1是特定評論者對特定電影的第一評級,而R2是第二評級。 我們需要討論同一個人對同一部電影的2條評論,因此R1.mID = R2.mID和R1.rID = R2.rID。接下來,爲了確保R1確實是第一個,按照時間順序,我們設置R1.ratingDate < R2.ratingDate,並確保R2確實得到了更高的分數,我們設置R2.stars> R1.stars。

你可以檢查看看,這給了我們rID 201,這是正確的答案(可以通過檢查數據來驗證)。現在我們需要顯示電影評論者的名字和標題,而不是rID。

select distinct name, title 
from Movie, Reviewer, Rating 
where Movie.mID = Rating.mID and Reviewer.rID = Rating.rID and Rating.rID in (select R1.rID from   
Rating R1, Rating R2 where R1.mID =R2.mID and R1.rID = R2.rID and R1.ratingDate < R2.ratingDate 
and R2.stars > R1.stars); 

在:

我做的所有3間關係的叉積(?我想使用聯接將清潔劑),刪除重複和使用上面列出的where子句子查詢的查詢這樣做where子句中,我只是通過設置相應的mID和rID使交叉產品變爲自然聯接,並確保rID(稱爲用於消除歧義的Rating.rID)由我寫的初始查詢確定。

0

我會建議在子查詢中使用Self Join來標識審閱者,然後使用結果獲取審閱者和電影標題的名稱。

SELECT name, title FROM Reviewer R join (SELECT Ra.mID as mID, Ra.rID as rID FROM Rating Ra JOIN Rating Rb ON Ra.mID=Rb.mID WHERE Ra.rID=Rb.rID AND Ra.ratingDate<Rb.ratingDate AND Ra.stars<Rb.stars) AS Tmp ON R.rID=Tmp.rID JOIN Movie M ON M.mID=Tmp.mID 
相關問題