结合两个复杂的查询

时间:2015-07-17 18:47:50

标签: 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 
    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数据库,访问的关系视图仅供参考。

1 个答案:

答案 0 :(得分:1)

看起来您的第一个查询正在尝试确定在安排了大多数广告位的当天安排的广告位数。它有点狡猾,但仔细分析后,我怀疑它能正确计算。鉴于你提出的关系,这将是一个更好的起点:

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。

您的第二个查询格式奇怪,但看起来基本上是正确的。如果你想要通过第二个查询来优化第一个查询的结果,我想你的意思是你想要将第一个绘制的SlotTime限制为通过第二个确定的与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 s 。这是一种方法:

WHERE

使用内部联接来执行额外过滤。或者,您可以使用IN条件和Slot.SlotNo条件来完成同样的事情。

请注意,这在很大程度上取决于您提供的关系结构。特别是,它假定原始的第二个查询不会返回任何重复项,而这些重复项又取决于每个Programme.C_val与最多一个sticknav { background: #b50000; height: 46px; width: 1080px; margin:auto; left: 0px; right: 0px; position: absolute; z-index: 1; border-top: 4px solid #e50000; webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.49); box-shadow: 0 2px 6px rgba(0,0,0,0.49); -webkit-transition: all 1s; -moz-transition: all 1s; -ms-transition: all 1s; -o-transition: all 1s; transition: all 1s; } .fixed { position:fixed; width: 1200px; } 相关联。这是您的关系结构,确保而不是查询。