首页 > 解决方案 > 将行乘以一行 - 问题

问题描述

mdl_course 看起来像这样

id name
1  Course name
2  Other Name
3  Third name

第二张表我有 mdl_scorm_scoes_track

id, course_id,meta_key,meta_value
1     1          score     100
1     1          status     passed
1     1          sesion_start xyz

我试图为每门课程从 200 个元键中提取 2 个元键以获得这样的结果

id, course name, course_id, score status
1      Course name    1      100    passed

我不能让它工作。我有很多行有空数据

这是我尝试做的事情 https://www.db-fiddle.com/f/q8drxvhaY86BuiFrggxYWK/2

你有两张桌子 mdl_course , mdl_scorm_scoes_track

SELECT sct.id,c.fullname,sct.userid,
       max(case when sct.element ='cmi.core.lesson_status' then sct.VALUE end) AS STATUS,
  max(case when sct.element ='cmi.core.score.raw' then sct.VALUE end) AS score
FROM mdl_scorm_scoes_track sct
JOIN mdl_course c ON c.id = sct.scormid WHERE sct.USERid = 2 
group BY sct.id;

我有很多空行

id  fullname    userid  STATUS  score
2993    SCORM z JS  2            100
2996    SCORM z JS  2   passed  
3019    SCORM z JS  2   incomplete  
3022    SCORM z JS  2             75
3025    SCORM z JS  2   passed  
3217    SCORM z JS  2            100
3220    SCORM z JS  2   passed

2993 和 2996 也应该是一行 3022 和 3025 以及 3217 和 3220。

标签: mysqlsqlpivot-tablemoodleentity-attribute-value

解决方案


您需要通过添加条件来删除许多您不感兴趣的行

sct.element IN ('cmi.core.lesson_status', 'cmi.core.score.raw')

在 WHERE 子句中:

WHERE 
  sct.USERid = 2 
  AND 
  sct.element IN ('cmi.core.lesson_status', 'cmi.core.score.raw')

您还需要在group by子句中包含您选择的所有非聚合列:

SELECT 
  sct.id,
  c.fullname,
  sct.userid,
  max(case when sct.element ='cmi.core.lesson_status' then sct.VALUE end) AS STATUS,
  max(case when sct.element ='cmi.core.score.raw' then sct.VALUE end) AS score
FROM mdl_scorm_scoes_track sct JOIN mdl_course c 
ON c.id = sct.scormid 
WHERE sct.USERid = 2 
AND sct.element IN ('cmi.core.lesson_status', 'cmi.core.score.raw') 
group BY sct.id, c.fullname, sct.userid

如果这不是您想要的分组,那么也许您需要重新考虑它。


推荐阅读