mysql - 将行乘以一行 - 问题
问题描述
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。
解决方案
您需要通过添加条件来删除许多您不感兴趣的行
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
如果这不是您想要的分组,那么也许您需要重新考虑它。
推荐阅读
- javascript - 如何检查传递给 Typescript 中函数的参数?
- javascript - 如何补充脚本,使菜单通过点击外部隐藏?
- c++ - 如何仅从类类型推断类构造函数参数的类型
- javascript - 如何根据从下拉菜单中选择的选项设置不同的输入字段模式?
- php - 为什么我不能在 wordpress 中使用 $wpdb
- javascript - 将输入转换为小写
- angular - (change) $event 不起作用,可能是语法问题
- java - 将 EditText 背景设置为透明后闪烁的光标消失
- angular - 带有下拉菜单的 Angular 8 文本输入
- arrays - 如何在json中仅获取Array部分