【问题标题】:conditional join between several tables of moodle's databaseMoodle数据库的几个表之间的条件连接
【发布时间】:2019-08-10 02:43:49
【问题描述】:

我需要根据前一个表的输出在几个表之间创建一个连接查询。我正在尝试使用 case when 语句如下,但它显示错误!任何形式的帮助表示赞赏

SELECT completion.userid, completion. coursemoduleid, completion. timemodified, 
module.course, user. idnumber as student_id, m.name as module_name, activity.name as activity_name
FROM `mdl_course_modules_completion` as completion

join mdl_course_modules as module 
on completion. coursemoduleid = module.id

join mdl_user as user on user.id = completion.userid

join mdl_modules as m on completion. coursemoduleid = m.id

join 
CASE WHEN module_name = 'assign'THEN 'mdl_assign'
     WHEN module_name = 'assignment'  THEN 'mdl_assignment'
     ELSE "quiz"
END AS activity

on activity.id = m.id LIMIT 0, 30

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。) PS 你有一个语法错误。阅读语法和手册。显示组成子表达式是可以的。明确说明您的问题是关于 那个错误 并在稍后的新帖子中询问您的总体目标。 PS 显然这里有非最小代码/数据。
  • use text, not images/links, for text--including tables & ERDs. 解释或引用其他文本。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图像中包含图例/键和说明。让您的帖子自成一体。

标签: mysql join conditional-statements moodle


【解决方案1】:

没有“条件连接”之类的东西。相反,您可以使用两个 LEFT JOIN 和 COALESCE():

SELECT completion.userid,
  ...
  COALESCE(activity1.name, activity2.name) as activity_name -- SELECT first non NULL value
FROM `mdl_course_modules_completion` as completion
...
LEFT JOIN mdl_assign activity1
  ON  activity1.id = m.id    -- JOIN condition
  AND module_name = 'assign' -- CASE condition
LEFT JOIN mdl_assignment activity2
  ON  activity2.id = m.id        -- JOIN condition
  AND module_name = 'assignment' -- CASE condition

【讨论】:

    【解决方案2】:

    希望对你有所帮助-

    SELECT completion.userid, completion. coursemoduleid, completion. timemodified, 
    module.course, user. idnumber as student_id, m.name as module_name,(CASE WHEN (a.name != '') THEN a.name ELSE (CASE WHEN (ass.name != '') THEN ass.name ELSE q.name END) END) as activity_name
    FROM `mdl_course_modules_completion` as completion
    join mdl_course_modules as module 
    on completion. coursemoduleid = module.id
    join mdl_user as user on user.id = completion.userid
    join mdl_modules as m on completion. coursemoduleid = m.id
    left join mdl_assign as a on a.id = m.id
    left join mdl_assignment as ass on ass.id = m.id
    left join mdl_quiz as q on q.id = m.id
    where m.name in ('assign','assignment','quiz')
    LIMIT 0, 30
    

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      相关资源
      最近更新 更多