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