我有两个单独的查询,这两个查询都有效。
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数据库,访问的关系视图仅供参考。
答案 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;
}
相关联。这是您的关系结构,确保而不是查询。