-2

私は現在、データベースに関するオンライン スタンフォード クラスを受講しています。この sql の問題を解決するのを手伝っていただければ、とても助かります。申し訳ありませんが、私は完全な初心者です。

テーブルムービー:

mID | title | year | director

テーブルの評価

rID | mID | stars | ratingDate

表レビュー担当者

rID | name

両方のレビュアーが同じ映画に評価を付けたレビュアーのすべてのペアについて、両方のレビュアーの名前を返します。重複を排除し、レビュアーを自分自身とペアにせず、各ペアを 1 回だけ含めます。ペアごとに、ペアの名前をアルファベット順に返します。

4

6 に答える 6

0

映画ごとの平均評価を見つける:

SELECT 
    [m].[mID],
    [m].[title],
    AVG([r].[stars]) AS [AvgRating]
  FROM [Movie] [m]
  LEFT JOIN [Rating] [r] ON [m].[mID] = [r].[mID]
  GROUP BY 
    [m].[mID],
    [m].[title]

映画ごとにユニークなレビュアーを見つける:

SELECT
    [r].[mID],
    [v].[rID],
    [v].[name]
  FROM [Reviewer] [v]
  INNER JOIN [Rating] [r] ON [v].[rID] = [r].[rID]
  GROUP BY
    [v].[rID],
    [v].[name],
    [r].[mID]

混ぜる:

SELECT 
  [rat].[mID],
  [rat].[title],
  [rev].[rID],
  [rev].[name],
  [rat].[AvgRating]
FROM
(
  SELECT 
    [m].[mID],
    [m].[title],
    AVG([r].[stars]) AS [AvgRating]
  FROM [Movie] [m]
  LEFT JOIN [Rating] [r] ON [m].[mID] = [r].[mID]
  GROUP BY 
    [m].[mID],
    [m].[title]
) AS [rat]
LEFT JOIN
(
  SELECT
    [r].[mID],
    [v].[rID],
    [v].[name]
  FROM [Reviewer] [v]
  INNER JOIN [Rating] [r] ON [v].[rID] = [r].[rID]
  GROUP BY
    [v].[rID],
    [v].[name],
    [r].[mID]
) AS [rev] ON [rat].[mID] = [rev].[mID]
ORDER BY 
  [rat].[mID] ASC,
  [rev].[name] ASC

フィドルについては、こちらをご覧ください

于 2013-01-12T21:54:50.830 に答える
0

私は同じコースを行っていますが、これが私が得た答えです:

SELECT DISTINCT name1, name2
FROM (SELECT R1.name AS name1, R2.name AS name2
FROM (Rating JOIN Reviewer using(rId)) AS R1,
(Rating JOIN Reviewer using(rId)) AS R2
WHERE R1.mId = R2.mId AND R1.rId <> R2.rId) AS Tuple
WHERE name1 < name2;

この質問はそれを求めていないので、なぜOPがタイトルの平均について話しているのかわかりません。

編集: さらに参照するために、ここにデータがあります: https://class.stanford.edu/c4x/DB/SQL/asset/moviedata.html

于 2015-03-08T19:09:11.880 に答える
0

これで始められます。

SELECT m.*, ra.*, re.*
FROM Movie m
JOIN Rating ra ON ra.mID = m.mID
JOIN Reviewer re ON re.rID = ra.rID
于 2013-01-12T21:07:33.677 に答える
0

多分このようなもの:

SELECT rev.rID, rev.name, m.title
FROM [Reviewer] rev 
   JOIN [Rating] rate ON rev.rID = rate.rID
   JOIN [Movie] m ON rate.mID = m.mID
   JOIN (
     SELECT mID
     FROM [Rating] 
     GROUP BY mID
     HAVING COUNT(Distinct rID) > 1
   ) m2 on m.mID = m2.mID
ORDER BY rev.name

- 編集

平均も取得する必要がある場合:

SELECT rev.rID, rev.name, m.title, ar.avgRating
FROM [Reviewer] rev 
   JOIN [Rating] rate ON rev.rID = rate.rID
   JOIN [Movie] m ON rate.mID = m.mID
   JOIN (
     SELECT mID
     FROM [Rating] 
     GROUP BY mID
     HAVING COUNT(Distinct rID) > 1
   ) m2 on m.mID = m2.mID
   JOIN (
     SELECT mID, AVG(stars) as avgRating
     FROM [Rating] 
     GROUP BY mID
   ) ar on m.mID = ar.mID
ORDER BY rev.name

そしてSQLフィドル

于 2013-01-12T21:10:01.490 に答える
0
select distinct r2.name, r1.name
from 
(select r1.rid, r1.mid, r2.name
from (select * from reviewer order by name) r2
join (select r1.rid, r1.mid from rating r1 join reviewer r2 on r1.rid = r2.rid order by r2.name) r1
on r2.rid = r1.rid
group by mid
order by r2.name) r1,
(select r1.rid, r1.mid, r2.name
from reviewer r2,
rating r1
where r1.rid = r2.rid)r2
where r1.rid <> r2.rid and r1.mid = r2.mID
order by r2.name, r1.name
于 2014-06-28T05:57:14.333 に答える