以下查詢向我提供設備租賃公司的項目報告。這是一個超級複雜的查詢,需要將近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