2012-03-03 61 views
0

我正在致力於一個名爲'rental system'(java)的項目,這是一個桌面應用程序。對於tenthouse店在哪裏都可用的rent.In保持DB(使用MySQL),我已經下表: -如何在特定日期或特定時間段查找可用項目

客戶表: -

C_ID --C_Name--C_ADD--C_contactNo 
1 -- abc --Add1 --XXXXXXXXX 
2 -- xyz --Add2 --xxxxxxxxx 
3 -- pqr --Add3 --xxxxxxxxx 

Item table:- 
Item_ID --Item_Name --Total_qty 
1  --chair  --200 
2  --pillow --500 
3  --sofa_large--100 
4  --Bedshits --600 
5  --Wedsofa --50 
6  --chair_A --150 

Cus_Order_tab :- 

O_ID -- C_ID--venue --startdate  --enddate 
1 -- 2 -- xyz --2012-03-03 4:30 --2012-03-04 2:30 
2 -- 3 -- pqr --2012-03-03 12:01--2012-03-07 6:00 
3 -- 2 -- xyz --2012-03-04 11:00--2012-03-09 5:00 
4 -- 1 -- ijk --2012-03-04 12:33--2012-03-05 7:30 

Item_order_tab:- 
O_ID --Item_ID -- Ordred_qty 
1 --2  -- 100 
1 --3  -- 50 
1 --4  -- 350 
2 --1  -- 75 
2 --4  -- 200 
2 --3  -- 30 
3 --1  -- 100 
4 --4  -- 50 
4 --2  -- 150 

與此我想查找特定日期或特定時間段內可用的項目。例如,考慮我在日期O_ID = 5 startdate ='2012-03-04 2:30'enddate =' 2012-03-05 3:30'爲了這個,我想看看itemList中,您可在此期間在以下甲: -


ITEMNAME - Availble_qty

椅 - ?

sofalarge - ?

枕頭 - ?

牀罩 - ?

wedsofa - ?

chair_A - ?


+1

你到目前爲止是什麼,這是功課? – fancyPants 2012-03-03 11:50:49

+0

不,你能幫我找到任何解決方案儘快... – user1246679 2012-03-03 14:28:19

回答

0

在任何論壇發帖時,至少嘗試一下你所要求的而不是簡單地要求答案是一個好主意。我們並不都坐在那裏等着爲你做你的工作。

那說,這應該讓你開始,但需要一些調整來處理員工之間的閾值,由於使用的時間,而不是分鐘 -

# This outermost query finds the minimum num of each product available 
# for the time period defined in the order 
#EXPLAIN 
SELECT 
    tmp2.item_id, 
    tmp2.item_name, 
    MIN(tmp2.num_available) AS num_available 
FROM (
    # This query left joins to the innermost derived table 
    # to find out how many of each product is available 
    # for each hour 
    SELECT 
     tmp.item_id, 
     tmp.item_name, 
     tmp.chour, 
     tmp.item_quantity - IFNULL(SUM(io.ordered_quantity), 0) AS num_available 
    FROM (
     # This inner query is to retrieve every possible 
     # hour for each product within the order's period 
     SELECT 
      i.item_id, 
      i.item_name, 
      co.startdate + INTERVAL th.h HOUR chour, 
      i.item_quantity 
     FROM item i 
     INNER JOIN temp_hours th 
     INNER JOIN cus_order co 
      ON HOUR(TIMEDIFF(co.enddate, co.startdate)) >= th.h 
     WHERE co.o_id = 5 
    ) AS tmp 
    LEFT JOIN cus_order co2 
     ON tmp.chour BETWEEN co2.startdate AND co2.enddate 
    LEFT JOIN item_order io 
     ON co2.o_id = io.o_id 
     AND tmp.item_id = io.item_id 
    GROUP BY 
     tmp.item_id, 
     tmp.item_name, 
     tmp.chour 
) AS tmp2 
GROUP BY 
    tmp2.item_id, 
    tmp2.item_name 

使用適當的指標將是非常重要的是得到這個表現不錯。你將需要填充一個temp_hours(h INT)表,其中從0開始連續設置,無論你的最大僱用期是幾小時。所以,如果你的最大僱用期是一個月,你應該創建一個從0到(31 * 24)的連續集。

+0

任何人都可以簡化以上查詢4我.... – user1246679 2012-04-02 05:54:16

+0

我寫的查詢有什麼問題?請將您的CREATE TABLE語句與「SHOW INDEXES」的輸出一起添加到您所涉及的每個表格中。 – nnichols 2012-04-02 09:53:02

相關問題