Mysql left join 4个可能的值

Mysql left join 4 possible values

我们在 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

结果 return "resource" 名称(资源名称、scormname、词汇表名称或测验名称)中的 NULL 值,并且只有一个有效的 "resource" 名称。我根据结果是否不为空来呈现结果。 但我想避免 "filter" 使用 PHP.

导致 resourcename、scormname、glossaryname 和 quizname 中的非空结果

谢谢!

可能是这样的 - 使用联合

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