我有此查询可从预订系统获取统计信息:
SELECT
COUNT(itemid) AS `num_items`,
COUNT(DISTINCT(reservation)) AS `num_reservations`,
CONCAT(MONTHNAME(`from`),' ',YEAR(`from`)) AS `group`
FROM
reserveditems
WHERE
category = 11
AND
( DATE(`from`) >= '2018-01-01' AND DATE(`until`) <= '2018-12-31')
GROUP BY
MONTH(`from`)
这给了我正确的数据,但我还需要获取所有没有结果的月份。
现在我得到了这个结果
"2" "1" "May 2018"
"3" "1" "July 2018"
"11" "8" "October 2018"
"17" "9" "November 2018"
但是我需要:
"0" "0" "January 2018"
"0" "0" "February 2018"
"0" "0" "March 2018"
"0" "0" "April 2018"
"2" "1" "May 2018"
"0" "0" "June 2018"
"3" "1" "July 2018"
"0" "0" "September 2018"
"11" "8" "October 2018"
"17" "9" "November 2018"
"0" "0" "December 2018"
不仅如此,用户还可以编辑日期范围,因此他们可能会要求输入从2017年9月到2018年12月的范围,因此这里从1到12的循环不是一个选择。
统计页面还允许用户确定GROUP BY方法,可以是月,年或日期。 因此,如果可以的话,可以填写用户选择的所有空白时间段
如果他们应该询问此数据,则可能是2016年的零结果,如果当天没有预订(例如周末,节假日...),则可能是一个月中所有日期的零结果。
因此,无法在第二张表中填充所有可能的日期,月份,年...,以将该表加入。
如果MySQL无法实现此解决方案,则我将不得不尝试在PHP中解决此问题,但是我认为MySQL的运行速度会比另一个循环更快(尤其是在 GROUP情况下)在DATE(from
) )
感谢您朝着正确的方向前进!
答案 0 :(得分:0)
虽然可以创建以0作为条目的临时表,然后与现有查询结合以获得完整的结果表,但这不是一个好主意。
数据库通常是在系统上扩展最难的事情,而应用程序代码则最简单。因此,使用应用程序代码来填补结果的空白是对资源的最佳利用。添加包含YEAR(from)*12 + MONTH(from) - 1
的列将使应用程序代码易于检测间隙。尽管这是一项额外的工作,但它使用相同的行数据,而不是创建一个新表并对其进行联接。