【问题标题】:MYSQL: covert a table of IDs into a table of namesMYSQL:将 ID 表转换为名称表
【发布时间】:2018-05-02 22:13:40
【问题描述】:

有人可以帮助我进行这种 SQL 练习吗?

电影(mID、片名、年份、导演) 定义:有一部电影的 ID 号为 mID、片名、发行年份和导演。

审阅者(rID、姓名) 定义:ID号为rID的reviewer有一定的名字。

评分(rID、mID、stars、ratingDate) 定义:评论者 rID 在某个 ratingDate 给电影 mID 的星级评分 (1-5)。

对于所有评论者对,如果两位评论者都对同一部电影进行评分,则返回两位评论者的姓名。消除重复,不要将审阅者与他们自己配对,并且每对只包含一次。对于每一对,按字母顺序返回该对中的名称。


我编写了以下查询来获取成对的审阅者 ID,但很难找到一种有效的方法来获取表中的审阅者姓名:

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;

【问题讨论】:

    标签: mysql


    【解决方案1】:

    放弃用于连接操作的老式逗号语法,改用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

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

    【讨论】:

    • 是的,当我刚刚开车回家时,我意识到进行名称比较的合适位置是在 where 子句中。
    • @Nick... 或者,我可以将 WHERE 更改为 AND 并将谓词合并到 n2 的内部连接中。 (但如果我这样做了,我会以另一种方式交换比较,AND n2.name &gt; n1.name,以符合我遵循的约定。)
    • 是的 - 无论哪种方式都比我输入的子查询好。哦,好吧,至少我说它可能不是最有效的解决方案! :)
    • 以这种方式消除重复只是自找麻烦。
    • @Strawberry:您是否指的是“重复”name 值的可能性......我们可以在GROUP BY 中包含rid 列,该修复可能会返回重复名称,并且不满足规范。或者,也许您的意思是使用 GROUP BY 折叠行以消除重复。这是一种常见的 SQL 模式,除非您指的是特定于 MySQL 的扩展,当 ONLY_FULL_GROUP_BYsql_mode 中省略时的非标准行为,以及非聚合且不依赖于功能的表达式......不知道你是什么意思是“自找麻烦”
    猜你喜欢
    • 2020-07-06
    • 2018-04-19
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多