以下查询向我提供设备租赁公司的项目报告。这是一个超级复杂的查询,需要将近20秒才能运行。这显然不是获取我正在查找的数据的正确方法。我从PHP构建这个查询,并在02-01-2011的开始日期和03-01-2011的结束日期,产品代码(p_code = 1)和产品池(i_pool = 1)中添加。这4条信息被传递给一个PHP函数,并注入到下面的sql中,以返回我需要的报表,以显示日历控件显示的项目数。我的问题是:是否有任何方法可以更好地简化或改进,或者更有效地运行,使用更好的连接或更好的方式来显示个别日子。mysql日报表查询
SELECT DISTINCT reportdays.reportday, count(*)
FROM
(SELECT '2011-02-01' + INTERVAL a + b DAY reportday
FROM
(SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3
UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
UNION SELECT 8 UNION SELECT 9) d,
(SELECT 0 b UNION SELECT 10 UNION SELECT 20
UNION SELECT 30 UNION SELECT 40) m
WHERE '2011-02-01' + INTERVAL a + b DAY < '2011-03-01'
ORDER BY a + b) as reportdays
JOIN rental_inv as line
ON DATE(FROM_UNIXTIME(line.ri_delivery_dte)) <= reportdays.reportday
AND DATE(FROM_UNIXTIME(line.ri_pickup_dte)) >= reportdays.reportday
LEFT OUTER JOIN rental_in as rent on line.ri_num = rent.ri_num
LEFT OUTER JOIN rental_cancels cancelled on rent.ri_num = cancelled.ri_num
LEFT OUTER JOIN inv inventory on line.i_num = inventory.i_num
LEFT OUTER JOIN product ON inventory.p_code = product.p_code
WHERE rent.ri_extend = 0 -- disregard extended rentals
AND cancelled.ri_num is null -- disregard cancelled rentals
AND inventory.p_code = 1
AND inventory.i_pool = 1
GROUP BY reportdays.reportday
如果有任何其他信息需要,让我知道,我会发布它。
我正在做一个可怕的工作来解释这个。我需要在一个小时左右的时间内重新修改这个问题。 – stephenbayer 2011-02-22 18:51:07
ri_delievery_dte和ri_pickup_dte是包含时间戳的int字段,为什么数据库设计人员使用时间戳来表示我不知道的日期。我认为日期字段会更好。如果ri_extend有一个值,那么这意味着订单已被替换为新订单,如果订单在rental_cancels表中列出,那么订单已被取消,这似乎是一种模糊数据的愚蠢方式,但我没有设计这个结构或数据库,它已经存在了10年。 – stephenbayer 2011-02-22 20:04:20