Mysql 将行乘为一行-问题
mdl_课程看起来像这样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
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分组