2012-03-03 63 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

相关问题