结合两个复杂的查询

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.

您的第二个查询的格式很奇怪,但基本上没有问题。当你说你想通过第二个优化第一个查询的结果时,我猜你的意思是你想限制第一个绘制的 SlotTimes 到与第二个确定的 Slots 相关联的那些.这是一种方法:

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 相关联。确保这一点的是您的关系结构,而不是查询。