Mysql setypes lt2,其中lt2.ID=@licensetype)) 和calendar.dy>=@fromdate 和calendar.dy

Mysql setypes lt2,其中lt2.ID=@licensetype)) 和calendar.dy>=@fromdate 和calendar.dy,mysql,database,null,Mysql,Database,Null,我认为这个查询应该会给您提供所需的结果(3/1为1,4/1和5/1为2)。您必须从日期和区域的交叉连接开始,然后左连接到相关许可证类型和日期的许可证类型和许可证: SELECT z.zoneID, DATE(c.dy) AS dy, z.seasonmax, z.daymax, COUNT(l.ID) AS sold FROM calendar c CROSS JOIN zones z LEFT JOIN licensetypes t ON t.ID = @licensetype AND FIN

我认为这个查询应该会给您提供所需的结果(3/1为1,4/1和5/1为2)。您必须从日期和区域的
交叉连接开始,然后
左连接到相关许可证类型和日期的
许可证类型和
许可证

SELECT z.zoneID, DATE(c.dy) AS dy, z.seasonmax, z.daymax, COUNT(l.ID) AS sold
FROM calendar c
CROSS JOIN zones z
LEFT JOIN licensetypes t ON t.ID = @licensetype AND FIND_IN_SET(z.zoneID, t.ValidForZone)
LEFT JOIN licenses l ON l.TypeID = t.ID AND DATE(c.dy) >= DATE(l.From) AND DATE(c.dy) < DATE(l.To)
WHERE DATE(c.dy) BETWEEN @fromdate AND @todate
GROUP BY dy, z.zoneID
选择z.zoneID,日期(c.dy)为dy,z.seasonmax,z.daymax,计数(l.ID)为已售出
从日历c
交叉连接区域z
左连接t.ID=@licensetype上的licensetypes t并在_集中查找_(z.zoneID,t.ValidForZone)
左连接许可证l.TypeID=t.ID和日期(c.dy)>=日期(l.From)和日期(c.dy)<日期(l.To)
其中日期(c.dy)介于@fromdate和@todate之间
按dy,z.zoneID分组

我认为这个查询应该会给出所需的结果(3/1为1,4/1和5/1为2)。您必须从日期和区域的
交叉连接开始,然后
左连接到相关许可证类型和日期的
许可证类型和
许可证

SELECT z.zoneID, DATE(c.dy) AS dy, z.seasonmax, z.daymax, COUNT(l.ID) AS sold
FROM calendar c
CROSS JOIN zones z
LEFT JOIN licensetypes t ON t.ID = @licensetype AND FIND_IN_SET(z.zoneID, t.ValidForZone)
LEFT JOIN licenses l ON l.TypeID = t.ID AND DATE(c.dy) >= DATE(l.From) AND DATE(c.dy) < DATE(l.To)
WHERE DATE(c.dy) BETWEEN @fromdate AND @todate
GROUP BY dy, z.zoneID
选择z.zoneID,日期(c.dy)为dy,z.seasonmax,z.daymax,计数(l.ID)为已售出
从日历c
交叉连接区域z
左连接t.ID=@licensetype上的licensetypes t并在_集中查找_(z.zoneID,t.ValidForZone)
左连接许可证l.TypeID=t.ID和日期(c.dy)>=日期(l.From)和日期(c.dy)<日期(l.To)
其中日期(c.dy)介于@fromdate和@todate之间
按dy,z.zoneID分组


在这些日期,它应该显示什么而不是空值?这不是使用
右键连接日历
,以便显示所有日历日期,甚至是第一次查询中不匹配的日期的要点吗?是否要显示
0
而不是
NULL
?使用售出时的
IFNULL(COUNT(lID),0
。但是如果没有售出任何物品,则没有区域ID,您希望显示什么来代替
NULL
?使用
IFNULL()
将null值替换为您想要的值。您好,无关:我认为您不应该在licensetypes中插入(1,'70,80'),请参见“是”,关于正确的联接,您是对的。我需要它每天显示每个区域的一行,以及区域表中的Zoneumber、seasonmax和daymax。在这些日期,它应该显示什么而不是空值?这不是使用
右键连接日历
,以便显示所有日历日期,甚至是第一次查询中不匹配的日期的要点吗?是否要显示
0
而不是
NULL
?使用售出时的
IFNULL(COUNT(lID),0
。但是如果没有售出任何物品,则没有区域ID,您希望显示什么来代替
NULL
?使用
IFNULL()
将null值替换为您想要的值。您好,无关:我认为您不应该在licensetypes中插入(1,'70,80'),请参见“是”,关于正确的联接,您是对的。我需要它每天显示每个区域的一行,以及区域表中的Zoneumber、seasonmax和daymax。谢谢,我还有很多东西要学!:)但是,查询中的计数不正确。在1月3日,应该有1个许可证对70区有效,2个许可证对80区有效。在1月4日,70区应有2个有效区,80区应有3个有效区。在1月5日,应该有1个在70区有效,1个在80区有效。@aanders77:我明白你的意思(你最初的查询也有同样的问题,所以我没有注意)。我担心修复数据库设计可能比调整查询更简单。。。我更新了我的答案。对不起,直到现在我才注意到我自己的查询也给出了错误的计数。谢谢,我还有很多东西要学!)但是,查询中的计数不正确。在1月3日,应该有1个许可证对70区有效,2个许可证对80区有效。在1月4日,70区应有2个有效区,80区应有3个有效区。在1月5日,应该有1个在70区有效,1个在80区有效。@aanders77:我明白你的意思(你最初的查询也有同样的问题,所以我没有注意)。我担心修复数据库设计可能比调整查询更简单。。。我更新了我的答案。对不起,直到现在我才注意到我自己的查询也给出了错误的计数。谢谢,我还有很多东西要学!)但是,查询中的计数不正确。在1月3日,应该有1个许可证对70区有效,2个许可证对80区有效。在1月4日,70区应有2个有效区,80区应有3个有效区。在1月5日,应该有1个在70区有效,1个在80区有效。对不起,我直到现在才注意到我自己的查询也给出了错误的计数:/I我想我看到了问题
lt.ID=@licensetype
仅应在选择要显示的区域时使用,而不应在获取许可证计数时使用。是这样吗?我现在没有时间更新查询,但它需要加入
licensetypes
两次:一次获取区域,另一次获取所有许可。是的,没错。可以通过
l.TypeID=@licensetype
检索许可证。我不认为我能理解这一点,所以我期待着你的更新。原谅我,你的查询给出了正确的计数。是我发了一个屁,忘了查询是在licensetype上过滤的(这是应该的)。谢谢,我还有很多东西要学呢!:)但是,查询中的计数不正确。在1月3日,应该有1个许可证对70区有效,2个许可证对80区有效。在1月4日,70区应有2个有效区,80区应有3个有效区。在1月5日,应该有1个在70区有效,1个在80区有效。对不起,我直到现在才注意到我自己的查询也给出了错误的计数:/I我想我看到了问题
lt.ID=@licensetype
仅应在选择要显示的区域时使用,而不应在获取许可证计数时使用。是这样吗?我现在没有时间更新查询,但它需要加入
licensetypes
两次:一次获取区域,另一次获取所有许可。是的,没错。许可证可通过
l.T检索
SELECT z.zoneID, calendar.dy, z.seasonmax, z.daymax, COUNT(DISTINCT l.ID) Asold
FROM 
    calendar
    CROSS JOIN zones z
    LEFT JOIN licensetypes lt ON z.zoneID IN(lt.ValidForZone)
    LEFT JOIN licenses l 
        ON  lt.ID = l.TypeID 
        AND calendar.dy BETWEEN DATE(l.From) AND DATE(l.To)
WHERE
    FIND_IN_SET( z.zoneID, ( SELECT lt2.ValidForZone FROM licensetypes lt2 WHERE lt2.ID = @licensetype ) )
    AND calendar.dy >= @fromdate
    AND calendar.dy <= @todate
GROUP BY z.zoneID, calendar.dy, z.seasonmax, z.daymax
ORDER BY dy
SELECT z.zoneID, DATE(c.dy) AS dy, z.seasonmax, z.daymax, COUNT(l.ID) AS sold
FROM calendar c
CROSS JOIN zones z
LEFT JOIN licensetypes t ON t.ID = @licensetype AND FIND_IN_SET(z.zoneID, t.ValidForZone)
LEFT JOIN licenses l ON l.TypeID = t.ID AND DATE(c.dy) >= DATE(l.From) AND DATE(c.dy) < DATE(l.To)
WHERE DATE(c.dy) BETWEEN @fromdate AND @todate
GROUP BY dy, z.zoneID