如何在特定日期或特定时间段内查找可用项目

时间:2012-03-03 11:37:47

标签: mysql

我正在开发一个名为'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 - ?


1 个答案:

答案 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)的连续集。