Mysql left join 4个可能的值

标签 mysql moodle

我们正在 Moodle 数据库中运行此查询:

SELECT l.*,
MAX(l.time) as time,cat.id as catid, cat.name as catname,c.id as courseid,
c.fullname as coursename,
m.name as module,
r.revision as revision,
r.name as resourcename,
sco.name as scormname,
glo.name as glossaryname,
qui.name as quizname
  FROM {log} l
  INNER JOIN {user} u ON l.userid = u.id
  INNER JOIN {course} c ON l.course = c.id
  INNER JOIN {course_categories} cat ON c.category = cat.id
  INNER JOIN {course_modules} cm ON l.cmid = cm.id
  INNER JOIN {modules} m ON cm.module = m.id
  LEFT JOIN {resource} r ON cm.instance = r.id and l.module = "resource"
  LEFT JOIN {scorm} sco ON cm.instance = sco.id and l.module = "scorm"
  LEFT JOIN {glossary} glo ON cm.instance = glo.id and l.module = "glossary"
  LEFT JOIN {quiz} qui ON cm.instance = qui.id and l.module = "quiz"
WHERE LOWER(l.action) LIKE LOWER(:modaction) COLLATE utf8_bin AND l.userid = :userid  
GROUP BY l.cmid
ORDER BY MAX(l.time) DESC

我想要这样的东西:

SELECT l.*,
MAX(l.time) as time,cat.id as catid, cat.name as catname,c.id as courseid,
c.fullname as coursename,
m.name as module,
r.revision as revision,
r.name as resourcename
  FROM {log} l
  INNER JOIN {user} u ON l.userid = u.id
  INNER JOIN {course} c ON l.course = c.id
  INNER JOIN {course_categories} cat ON c.category = cat.id
  INNER JOIN {course_modules} cm ON l.cmid = cm.id
  INNER JOIN {modules} m ON cm.module = m.id
  INNER JOIN (

  SELECT * {resource} re WHERE cm.instance = r.id OR 
  SELECT * {scorm} sco WHERE cm.instance = sco.id OR 
  SELECT * {glossary} WHERE ON cm.instance = glo.id OR
  SELECT * {quiz} qui WHERE cm.instance = qui.id OR

  ) as r   
WHERE LOWER(l.action) LIKE LOWER(:modaction) COLLATE utf8_bin AND l.userid = :userid  
GROUP BY l.cmid
ORDER BY MAX(l.time) DESC

结果在“资源”名称(资源名称、scormname、词汇表名称或测验名称)中返回 NULL 值,并且仅返回一个有效的“资源”名称。我根据结果是否不为空来渲染结果。 但我想避免使用 PHP 在资源名称、scormname、词汇表名称和测验名称中通过非空结果进行“过滤”。

谢谢!

最佳答案

也许是这样的 - 使用联合

SELECT l.cmid,
        MAX(l.time) as logtime,
        cat.id as catid,
        cat.name as catname,
        c.id as courseid,
        c.fullname as coursename,
        mods.module,
        mods.revision,
        mods.name as modname
FROM mdl_log l
JOIN mdl_user u ON l.userid = u.id
JOIN mdl_course c ON l.course = c.id
JOIN mdl_course_categories cat ON c.category = cat.id
JOIN (
    SELECT cm.id AS cmid, m.name AS module, r.name, r.revision
    FROM mdl_course_modules cm
    JOIN mdl_modules m ON cm.module = m.id AND m.name = 'resource'
    JOIN mdl_resource r ON r.id = cm.instance
    UNION
    SELECT cm.id AS cmid, m.name as modulentype, s.name, NULL AS revision
    FROM mdl_course_modules cm
    JOIN mdl_modules m ON cm.module = m.id AND m.name = 'scorm'
    JOIN mdl_scorm s ON s.id = cm.instance
    UNION
    SELECT cm.id AS cmid, m.name as modulentype, g.name, NULL AS revision
    FROM mdl_course_modules cm
    JOIN mdl_modules m ON cm.module = m.id AND m.name = 'glossary'
    JOIN mdl_glossary g ON g.id = cm.instance
    UNION
    SELECT cm.id AS cmid, m.name as modulentype, q.name, NULL AS revision
    FROM mdl_course_modules cm
    JOIN mdl_modules m ON cm.module = m.id AND m.name = 'quiz'
    JOIN mdl_quiz q ON q.id = cm.instance
    ) mods ON mods.cmid = l.cmid AND mods.module = l.module
WHERE l.module IN ('resource', 'scorm', 'glossary', 'quiz')
GROUP BY l.cmid
ORDER BY 1 DESC

关于Mysql left join 4个可能的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29976404/

相关文章:

php - 如何在 symfony (Propel) 中加入一个表并通过一个查询从两个表中检索对象

Mysql从两个表中选择

mysql - 我正在尝试从 pyspark 访问 mysql 表。我正在尝试使用 :

api - Moodle 用户注册 API

php - Moodle类(class)渲染器隐藏主题

php - 如何访问 Moodle 中 Mustache 模板中对象数组的值?

mysql - 如何从表中查询不同的帐号数量?

c++ - 为什么在 sqlite - QT here - 中触发查询失败?

php - 如何编辑 echo $OUTPUT->main_content() MOODLE

javascript - 根据类(class)自定义字段在类(class)页面上添加链接