结合两个复杂的查询
Combining two complicated queries
我有两个单独的查询,都有效。
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
赞。
忍不住觉得我的做法完全错了。我应该尝试合并这两个查询 - 还是完全不同的东西?
注意这是一个mysql数据库,访问关系视图仅供参考。
您的第一个查询似乎是在尝试确定在安排了最多时段的那一天安排的时段数。这有点古怪,但经过仔细分析,我怀疑它计算正确。不过,考虑到您介绍的关系,这将是一个更好的起点:
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
消除一个嵌套查询并将连接从最内层查询提升到外层查询是可行的,因为您要连接到 table Time
和 table SlotTime
与其有外键关系。因此,该连接既不会过滤掉任何行,也不会向结果中添加任何行。它仅用于将 day
列与结果相关联,以便您可以在最外层查询中按它分组。我提出的替代方案不仅更容易理解,而且还是标准的 SQL.
您的第二个查询的格式很奇怪,但基本上没有问题。当你说你想通过第二个优化第一个查询的结果时,我猜你的意思是你想限制第一个绘制的 SlotTime
s 到与第二个确定的 Slot
s 相关联的那些.这是一种方法:
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
子句来完成同样的事情。
请注意,这在很大程度上取决于您提供的关系结构。特别是,它假设原始的第二个查询不会 return 任何重复项,这又取决于每个 Slot.SlotNo
最多与一个 Programme.C_val
相关联。确保这一点的是您的关系结构,而不是查询。
我有两个单独的查询,都有效。
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
赞。
忍不住觉得我的做法完全错了。我应该尝试合并这两个查询 - 还是完全不同的东西?
注意这是一个mysql数据库,访问关系视图仅供参考。
您的第一个查询似乎是在尝试确定在安排了最多时段的那一天安排的时段数。这有点古怪,但经过仔细分析,我怀疑它计算正确。不过,考虑到您介绍的关系,这将是一个更好的起点:
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
消除一个嵌套查询并将连接从最内层查询提升到外层查询是可行的,因为您要连接到 table Time
和 table SlotTime
与其有外键关系。因此,该连接既不会过滤掉任何行,也不会向结果中添加任何行。它仅用于将 day
列与结果相关联,以便您可以在最外层查询中按它分组。我提出的替代方案不仅更容易理解,而且还是标准的 SQL.
您的第二个查询的格式很奇怪,但基本上没有问题。当你说你想通过第二个优化第一个查询的结果时,我猜你的意思是你想限制第一个绘制的 SlotTime
s 到与第二个确定的 Slot
s 相关联的那些.这是一种方法:
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
子句来完成同样的事情。
请注意,这在很大程度上取决于您提供的关系结构。特别是,它假设原始的第二个查询不会 return 任何重复项,这又取决于每个 Slot.SlotNo
最多与一个 Programme.C_val
相关联。确保这一点的是您的关系结构,而不是查询。