有人可以帮我解决这个SQL问题吗?
电影(mID,标题,年份,导演) 定义:有一部电影的ID号为mID,标题,发行年份和导演。
审稿人(rID,名称) 定义:ID号为rID的审阅者具有特定名称。
评分(rID,mID,stars,ratingDate) 定义:评论者rID给予电影mID一定数量的星级(1-5)在某个ratingDate上。
对于所有评论者对,以便两位评论者都对同一部电影进行评分,请返回两位评论者的姓名。消除重复,不与自己配对审阅者,并且每次只包括一次。对于每对,按字母顺序返回对中的名称。
我写了以下查询以获得成对的评论者'身份证,但很难找到一个有效的方式来获得审稿人和#39;表中的名字:
select distinct r1.rID as rID1, r2.rID as rID2
from Rating r1, Rating r2
where r1.rID < r2.rID
and r1.mID = r2.mID;
答案 0 :(得分:0)
抛弃连接操作的旧学校逗号语法,然后使用JOIN
关键字。
我们需要两个对审阅者表的引用,一个用于该行的每个审阅者。
SELECT n1.name AS r1_name
, n2.name AS r2_name
FROM rating r1
JOIN rating r2
ON r1.mid = r2.mid -- reviewed the same movie
AND r1.rid <> r2.rid -- don't pair reviewer with themselves (different reviewer)
JOIN reviewer n1
ON n1.rid = r1.rid
JOIN reviewer n2
ON n2.rid = r2.rid
WHERE n1.name < n2.name -- names in the pair in alphabetical order
GROUP
BY n1.rid
, n2.rid -- include each pair of reviewers only once (eliminate duplicates)
ORDER
BY n1.name
, n2.name -- result set more deterministic
“......最好采用一致的约定,例如始终使用小写名称创建和引用数据库和表。建议使用此约定以获得最大的可移植性和易用性。”
MySQL参考手册
https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html
编辑
将GROUP BY
更改为评论者rid
而不是name
。
这将只返回每一对“评论者”一次。如果两个或多个审阅者具有相同的名称,则查询可能会返回具有相同名称对的行,但这些行将代表不同的审阅者对。