Mysql 将行乘为一行-问题

Mysql 将行乘为一行-问题,mysql,sql,pivot-table,moodle,entity-attribute-value,Mysql,Sql,Pivot Table,Moodle,Entity Attribute Value,mdl_课程看起来像这样 id name 1 Course name 2 Other Name 3 Third name id, course name, course_id, score status 1 Course name 1 100 passed 第二张表我有mdl_scorm_scoes_轨道 id, course_id,meta_key,meta_value 1 1 score 100 1 1

mdl_课程看起来像这样

id name
1  Course name
2  Other Name
3  Third name
id, course name, course_id, score status
1      Course name    1      100    passed
第二张表我有mdl_scorm_scoes_轨道

id, course_id,meta_key,meta_value
1     1          score     100
1     1          status     passed
1     1          sesion_start xyz
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;
我试着为每门课从200个元键中抽出2个元键 像这样得到smth

id name
1  Course name
2  Other Name
3  Third name
id, course name, course_id, score status
1      Course name    1      100    passed
我不能让它工作。我得到了很多空数据行

这是我想做的

那里有两张桌子mdl_当然,mdl_scorm_scoes_track

id, course_id,meta_key,meta_value
1     1          score     100
1     1          status     passed
1     1          sesion_start xyz
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。

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

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

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

ID2993和2996也应该是一行3022和3025,以及3217和3220。为什么是这些对?是否需要应用逻辑?您需要查看mdl_scorm_scoes_跟踪表。你会看到有很多键->值行具有相同的id(scoid),我只想得到几行数据并将它们组合成一行。看看这个例子-这就是我需要将数据组合成一行的例子。好的,我有了它,你需要按尝试分组,所以完整的sql将是:选择sct.id,c.fullname,sct.userid,sct.trunt,max(当sct.element='cmi.core.lesson\u status'然后sct.VALUE end时的情况)作为状态,max(当sct.element='cmi.core.score.raw'然后sct.VALUE end时的情况)作为mdl\u scorm\u scoes\u track sct的分数在c.id=sct.scormid上加入mdl\u课程c,其中sct.USERid=2和c.fullname=“scorm z JS”和sct.element在('cmi.core.lesson状态,'cmi.core.core.score.raw')按sct分组