2012-03-14 25 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 

(私は上記のクエリから欠落しているWHERE句がある感じを持っているが、それをどこに配置するかを確認していない)

(私が学んだことから、RIGHTおよびFULL OUTERが現在の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'); 

私はこのような他の比較的類似の質問がありますが、私は上のいくつかの助けを得ればこの1つでは、このパターンとテクニックをこのパターンから次のパターンに適用できるはずです。

ありがとうございます! :)要件の説明から

答えて

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 

EDIT:requiremetsが変更されました。このクエリは、後でその映画に賛成する意見を変更した査読者のリストを返す。 2回目の評価に参加することで、星と日付に2つのフィルターを追加して参加します。

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

+0

@Rob私は私の答えを編集しました。 –

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

フィードバックに感謝します:)。私は "NikolaMarkovinović"のためにあなたと同じことを言うことができます。あなたのフィードバックの両方が私を助けてくれるが、混乱のためにお詫び申し上げます:) – Rob

0

これはおそらく私がやったように、スタンフォードのSQLミニコースでやったことでしょう。ここでは私が答えを得たのです(私は講義を見る前にSQLを経験していませんでしたので、うまくいけば恐ろしいことではありません):

ムービーを2回評価したレビュアー第二として

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を設定します。

これは正しい回答であるrID201を示しているかどうかを確認できます(データを確認して確認できます)。今度は、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

サブクエリで自己結合を使用してレビューアを識別し、その結果を使用してレビューアとムービータイトルの名前を取得することをお勧めします。

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 
関連する問題