如何使用单条SQL查询从多张关联表获取数据?——获取nid为1的所有节目及其对应剧集与评分的方法
解决方案:单条SQL查询搞定多层关联数据获取
当然不需要执行多条查询!关系型数据库的核心优势之一就是通过多表连接一次性拉取多层级的关联数据,正好适配你的需求。
表关联逻辑梳理
先明确四张表的关联关系:
Networks和Shows:通过nid(Networks.nid=Shows.s_nid)关联,定位指定网络下的所有节目Shows和Episode:通过sid(Shows.sid=Episode.e_sid)关联,找到每个节目对应的剧集Episode和Episode_ratings:通过eid(Episode.eid=Episode_ratings.er_eid)关联,获取每个剧集的评分记录
基础查询(获取所有明细数据)
下面这条SQL语句会一次性拉取nid=1的所有节目、对应剧集以及每个剧集的每一条评分:
SELECT n.nid, n.nname, s.sid, s.sname, e.eid, e.ename, er.ervalue FROM Networks n JOIN Shows s ON n.nid = s.s_nid JOIN Episode e ON s.sid = e.e_sid LEFT JOIN Episode_ratings er ON e.eid = er.er_eid WHERE n.nid = 1;
这里用LEFT JOIN关联Episode_ratings是为了保留没有评分的剧集(如果存在的话);如果只需要显示有评分的剧集,把LEFT JOIN换成INNER JOIN即可。
进阶:获取剧集的平均评分
如果不需要每条评分的明细,而是想要每个剧集的平均评分,可以加入聚合函数优化结果:
SELECT n.nid, n.nname, s.sid, s.sname, e.eid, e.ename, AVG(er.ervalue) AS average_rating, COUNT(er.ervalue) AS rating_count FROM Networks n JOIN Shows s ON n.nid = s.s_nid JOIN Episode e ON s.sid = e.e_sid LEFT JOIN Episode_ratings er ON e.eid = er.er_eid WHERE n.nid = 1 GROUP BY n.nid, n.nname, s.sid, s.sname, e.eid, e.ename;
这条语句会合并同一剧集的评分,计算出平均分和评分次数,结果更简洁直观。
总结
完全不需要执行多条查询,利用多表连接就能在单条SQL里完成所有数据的获取。根据你需要的是明细数据还是聚合数据,选择对应的语句即可。
内容的提问来源于stack exchange,提问作者Minstrels
相关产品推荐
相关产品推荐

