Mysql 多表上具有多个联接的SQL查询

Mysql 多表上具有多个联接的SQL查询,mysql,Mysql,我创建这个查询是为了根据多个表匹配数据,但我觉得它有点复杂 我需要从以下表格中进行选择: 引导 讲师及其他选择 讲师日历 使用以下关系: leads.sequence = instructors_options.instructor_seq leads.sequence = instructor_calendar.instructor_seq 并且以下筛选器必须匹配: lead.lead_类型=‘讲师’ 讲师_options.option_name='student_cap'和讲师_op

我创建这个查询是为了根据多个表匹配数据,但我觉得它有点复杂

我需要从以下表格中进行选择:

  • 引导
  • 讲师及其他选择
  • 讲师日历
使用以下关系:

leads.sequence = instructors_options.instructor_seq
leads.sequence = instructor_calendar.instructor_seq
并且以下筛选器必须匹配:

  • lead.lead_类型=‘讲师’
  • 讲师_options.option_name='student_cap'和讲师_options.value>0
  • 讲师_options.option_name='car_type'和讲师_options.value='variable'
  • 讲师_options.option_name='areas_covered'和讲师_options.value='variable'
  • 讲师\u calendar.Studior\u姓名='AVAILABLE'和讲师\u calendar.date>='variable'和讲师\u calendar.date'0') 右连接 讲师_选项io2 在…上 i、 顺序=io2.1和 io2.option_name='car_type'和io2.value='“$bookingData[“car_type”]。” 右连接 讲师选项io3 在…上 i、 顺序=io3.1和 io3.option_name='areas_covered'AND(io3.value LIKE'.substr($postcode,0,1)。“'或io3.value LIKE'.substr($postcode,0,2)。”'或io3.value LIKE'.substr($postcode,0,3)。“'或io3.value LIKE'.substr($postcode,0,4)。” 右连接 讲师选项io4 在…上 i、 顺序=io4.1和 io4.option_name='dialog_updates'和io4.value='1' 右连接 教师日历 在…上 i、 顺序=ic.讲师顺序和 ic.U名称=‘可用’和 ic.date>=”.ChangeDateFormat($date,'Y-m-d')。”和
    ic.date您正在查找某些日历条目。因此,从该表中进行选择

    其中一个条件是相关的讲师序列具有所有四个特定选项。因此,按照讲师顺序汇总选项,并保留符合所有标准的选项。在子句中使用
    ,获取这些讲师序列的日历条目

    select 
      instructor_seq,
      date, 
      start_time, 
      end_time
    from instructor_calendar 
    where pupil_name = 'AVAILABLE' 
    and date >= '2017-01-01' 
    and date <= '2017-05-31'
    and instructor_seq in
    (
      select instructor_seq
      from instructors_options
      group by instructor_seq
      having sum(option_name = 'pupil_cap'     and value > 0)   > 0
         and sum(option_name = 'car_type'      and value = 123) > 0
         and sum(option_name = 'areas_covered' and value = 456) > 0
         and sum(option_name = 'diary_updates' and value = 1)   > 0
    );
    
    选择
    讲师(续),
    日期,
    开始时间,
    结束时间
    从讲师日历
    其中学生姓名=‘可用’
    日期>='2017-01-01'
    日期(0)>0
    和和(选项名称='car\u type'和值=123)>0
    和和(选项名称=‘覆盖面积’和值=456)>0
    和总和(选项名称=‘日志更新’和值=1)>0
    );
    

    顺便说一下,
    HAVING
    子句使用MySQL的
    true=1
    false=0

    您正在查找某些日历条目。因此,从该表中进行选择

    其中一个条件是相关的讲师序列具有所有四个特定选项。因此,按照讲师顺序汇总选项,并保留符合所有标准的选项。在
    子句中使用
    ,获取这些讲师序列的日历条目

    select 
      instructor_seq,
      date, 
      start_time, 
      end_time
    from instructor_calendar 
    where pupil_name = 'AVAILABLE' 
    and date >= '2017-01-01' 
    and date <= '2017-05-31'
    and instructor_seq in
    (
      select instructor_seq
      from instructors_options
      group by instructor_seq
      having sum(option_name = 'pupil_cap'     and value > 0)   > 0
         and sum(option_name = 'car_type'      and value = 123) > 0
         and sum(option_name = 'areas_covered' and value = 456) > 0
         and sum(option_name = 'diary_updates' and value = 1)   > 0
    );
    
    选择
    讲师(续),
    日期,
    开始时间,
    结束时间
    从讲师日历
    其中学生姓名=‘可用’
    日期>='2017-01-01'
    日期(0)>0
    和和(选项名称='car\u type'和值=123)>0
    和和(选项名称=‘覆盖面积’和值=456)>0
    和总和(选项名称=‘日志更新’和值=1)>0
    );
    

    顺便问一下,
    HAVING
    子句使用了MySQL的
    true=1
    false=0

    这是MySQL问题还是SQLServer问题?这是两种完全不同的产品,并且都有标签。为什么?抱歉-我的错误,一定是无意中单击了sql Server。我注意到的第一件事是,您正在查找“必须”匹配项,但有左连接和右连接。你确定不想要内部联接吗?你要么有一个额外的连接(io4),要么在需求列表中遗漏了:)你能解释一下表之间的基数吗?我认为这是
    Leads(1)-@JacobH-错过了那一个-参见更新:)这是一个MySQL问题,还是一个SQLServer问题?这是两种完全不同的产品,并且都有标签。为什么?抱歉-我的错误,一定是无意中单击了sql Server。我注意到的第一件事是,您正在查找“必须”匹配项,但有左连接和右连接。你确定不想要内部联接吗?你要么有一个额外的连接(io4),要么在需求列表中遗漏了:)你能解释一下表之间的基数吗?我认为这是
    Leads(1)-@JacobH-错过了那一个-见更新:)好的,我可以测试一下。刚才的另一个想法是,目前这是在所选日期和所选日期+7天之间进行搜索。如果没有返回结果,我将再次运行完全相同的查询,但更改日期筛选器。我可以在一个查询中运行这一功能吗?如果没有返回任何结果,它将删除标准SQL中的第二个日期。您只需选择两个星期,然后使用
    行数
    按周对记录进行排名,并保留排名最佳的一周。MySQL没有这个功能。你通常会用MySQL中的变量来模拟这一点。好吧,放弃我的最后一条评论。如果没有找到结果,我将继续重新运行查询。我首先需要循环查看日期,然后是每个日期的时间。在循环中运行另一个查询的最佳方法是什么?好的,我可以对此进行测试。刚才的另一个想法是,目前这是在所选日期和所选日期+7天之间进行搜索。如果没有返回结果,我将再次运行完全相同的查询,但更改日期筛选器。我可以在一个查询中运行这一功能吗?如果没有返回任何结果,它将删除标准SQL中的第二个日期。您只需选择两个星期,然后使用
    行数
    按周对记录进行排名,并保留排名最佳的一周。MySQL没有这个功能。你通常会用MySQL中的变量来模拟这一点。好吧,放弃我的最后一条评论。如果没有结果,我将继续重新运行查询