我正在开发一个名为'rental system'(java)的项目,这是一个桌面应用程序。对于一个帐篷商店,其中的物品可以出租。在维护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 - ?
枕头 - ?Bedshits - ?
wedsofa - ?
chair_A - ?
答案 0 :(得分: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
使用适当的指数对于获得良好的性能非常重要。您需要使用从0开始的连续集合填充temp_hours(h INT)表格,以及您的最长租用期限(以小时为单位)。因此,如果您的最长租期是一个月,您应该创建一个从0到(31 * 24)的连续集。