gpt4 book ai didi

mysql - 结合两个复杂的查询

转载 作者:行者123 更新时间:2023-11-28 23:56:46 25 4
gpt4 key购买 nike

我有两个独立的查询,都有效。

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 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))

第一个查询是问题的核心,但我希望改进其结果(使用第二个查询)。

但是,结果有点乱(而且,没有什么大惊喜,不起作用):

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

哎呀。

忍不住觉得我的做法完全错了。我应该尝试合并这两个查询 - 还是完全不同的东西?

relationships of tables

注意这是一个mysql数据库,access的关系 View 只是为了说明。

最佳答案

您的第一个查询似乎是在尝试确定在安排了最多时段的那一天安排的时段数。这有点古怪,但经过仔分割析,我怀疑它计算正确。不过,鉴于您介绍的关系,这将是一个更好的起点:

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。

您的第二个查询格式很奇怪,但看起来基本上是正确的。当你说你想通过第二个查询优化第一个查询的结果时,我猜你的意思是你想限制第一个绘制的 SlotTimes 到那些与 Slot 通过第二个确定。这是一种方法:

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.SlotNo 最多与一个 Programme.C_val 相关联。确保这一点的是您的关系结构,而不是查询。

关于mysql - 结合两个复杂的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31482692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com