MYSQL:将ID表转换为名称表

时间:2018-05-02 03:39:57

标签: mysql

有人可以帮我解决这个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;

1 个答案:

答案 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

这将只返回每一对“评论者”一次。如果两个或多个审阅者具有相同的名称,则查询可能会返回具有相同名称对的行,但这些行将代表不同的审阅者对。