Mysql 组合两个复杂的查询
我有两个独立的查询,它们都可以工作Mysql 组合两个复杂的查询,mysql,sql,select,subquery,Mysql,Sql,Select,Subquery,我有两个独立的查询,它们都可以工作 SELECT MAX(instances) FROM ( SELECT FK_Hour, day As day, Count(FK_Hour) As instances FROM ( Select slottime.FK_Hour, time.day From slottime INNER JOIN time ON slottime.FK_Hour = time.Hour ) As C
SELECT MAX(instances)
FROM (
SELECT FK_Hour, day As day, Count(FK_Hour) As instances
FROM (
Select slottime.FK_Hour, time.day
From slottime INNER JOIN time ON slottime.FK_Hour = time.Hour
) As C
GROUP By FK_Hour
) AS counts
GROUP By day
及
第一个查询是问题的核心,但我希望使用第二个查询来优化其结果
然而,结果有点混乱,没有什么大的意外,不起作用:
SELECT MAX(instances)
FROM (SELECT FK_Hour, day As day, Count(FK_Hour) As instances
FROM (Select slottime.FK_Hour, slottime.FK_SlotNo, time.day
From slottime INNER JOIN time ON slottime.FK_Hour = time.Hour )
FROM (Select slot.SlotNo As FK_SlotNo
FROM (Programme INNER JOIN Module ON Programme.COURSE = Module.FK_Course) INNER JOIN (Slot INNER JOIN SlotDemo ON Slot.SlotNo = SlotDemo.FK_SlotNo) ON Module.ModuleCode = Slot.FK_ModuleCode
GROUP BY Slot.SlotNo, Programme.C_val
HAVING (((Count(SlotDemo.FK_Demonstrator))<5) AND ((Programme.C_val)<6)))
As C GROUP By FK_Hour
)
AS counts GROUP By day
哎呀
我忍不住觉得我完全错了。我应该尝试将两个查询合并起来,还是完全不同的东西
注意:这是一个mysql数据库,access的关系视图仅用于说明。您的第一个查询似乎是在尝试确定计划的插槽数最多的当天计划的插槽数。这有点可疑,但经过仔细分析,我怀疑它的计算是正确的。但是,考虑到您所呈现的关系,这将是一个更好的起点:
select max(sph.instances)
from (
select FK_Hour, count(*) as instances
from slottime
group by FK_Hour
) sph
join time t
on sph.FK_Hour = t.Hour
group by t.day
消除一个嵌套查询并将连接从最里面的查询提升到最外面的查询是有效的,因为您要连接到表Time的整个主键,而表SlotTime与它有外键关系。因此,该联接既不会过滤掉任何行,也不会向结果中添加任何行。它只用于将day列与结果关联,以便您可以在最外层的查询中按它分组。我提出的替代方案不仅更容易理解,而且是标准SQL
您的第二个查询的格式很奇怪,但看起来基本正常。当您说要通过第二个查询优化第一个查询的结果时,我想您的意思是要将第一个查询绘制的时隙限制为与通过第二个查询确定的时隙相关联的时隙。有一种方法可以做到这一点:
select max(sph.instances)
from (
select FK_Hour, count(*) as instances
from slottime
join (
select slot.SlotNo As FK_SlotNo
from Programme
join Module
on Programme.COURSE = Module.FK_Course
join Slot
on Module.ModuleCode = Slot.FK_ModuleCode
join SlotDemo
on Slot.SlotNo = SlotDemo.FK_SlotNo
group by Slot.SlotNo, Programme.C_val
having (Count(SlotDemo.FK_Demonstrator) < 5) AND (Programme.C_val < 6)
) s
on slottime.FK_SlotNo = s.FK_SlotNo
group by FK_Hour
) sph
join time t
on sph.FK_Hour = t.Hour
group by t.day
使用内部联接执行额外筛选的。或者,您可以使用带有IN条件的WHERE子句来完成相同的任务
请注意,这在很大程度上取决于您介绍的关系结构。特别是,它假设原始的第二个查询不会返回任何重复项,而这又取决于每个Slot.slotn最多与一个program.C_val关联。确保这一点的是您的关系结构,而不是查询。第一个查询似乎没有多大意义。你只需要从内部组员那里得到一个不确定的日期,通常是最后一天,你以后会用它作为外部组员;最里面的查询实际上不需要是包含它的查询的子查询。@uuerdo不,它不起作用-它每天返回一个数字,这才是我真正想要的。我已经用样本数据对它进行了测试,似乎没有问题。你使用的是什么数据库?如果您的数据库支持CTE,那么这可能是一个不错的选择。许多数据库会直接拒绝它,因为它们从聚合查询中选择了一列,而该列不是组的函数。MySQL接受此类查询作为扩展,但不定义从哪些行中提取此类列的值。在某些情况下,这是可以接受的,甚至是有用的,但尝试将结果封装在一个内联视图中,按这样的列分组似乎不太可能是这种情况之一。@JohnBollinger它不会是1,它将是该FK_小时的时间表中的记录数。。。不管哪一天。啊。。。我希望能吃我的蛋糕。令人失望的是,按日订购似乎不太可能。我想这是我所使用的结构的缺陷,但是我曾经并且现在仍然有动机使用脚本语言来处理它,而脚本语言已经被塑造成适合的形式。如果你想要特定的结果排序,那么你应该添加一个适当的ORDERBY子句。分组并不意味着排序。好吧,但我的意思是,与答案中的第一个查询不同,组合查询似乎只返回最后一行或最后一天。
select max(sph.instances)
from (
select FK_Hour, count(*) as instances
from slottime
join (
select slot.SlotNo As FK_SlotNo
from Programme
join Module
on Programme.COURSE = Module.FK_Course
join Slot
on Module.ModuleCode = Slot.FK_ModuleCode
join SlotDemo
on Slot.SlotNo = SlotDemo.FK_SlotNo
group by Slot.SlotNo, Programme.C_val
having (Count(SlotDemo.FK_Demonstrator) < 5) AND (Programme.C_val < 6)
) s
on slottime.FK_SlotNo = s.FK_SlotNo
group by FK_Hour
) sph
join time t
on sph.FK_Hour = t.Hour
group by t.day