基于初始查询

时间:2018-02-28 14:01:33

标签: php mysql sql db2

我前几天发布了一个关于这个脚本/查询的问题,但它是关于严格能够插入值,而不是包括新逻辑。

我目前有一个PHP脚本,可以使用'在选择和插入方面,我需要对它进行一些逻辑修改才能做更多的事情。

我有一个DB2 select查询:

//DB2 Select query
$plcQueryDB2 = " 

        select  
            invnoc as INVOICE,
            cstnoc AS DEALER,
            framec AS FRAME,
            covr1c AS COVER,
            colr1c AS COLOR ,
            extd1d AS SHIPDATE,
            orqtyc AS QUANTITY
        FROM GPORPCFL
        where extd1d >= curdate()
        group by invnoc,cstnoc, orqtyc, framec, covr1c,colr1c, extd1d
        order by invnoc asc
";

然后我基本上准备并执行它,并循环它以便执行PDO调用以插入到mysql中。我实际上使用了DB2查询中的一些变量来加入'将一些MySQL数据放在另一个表中,然后从中获取所有数据并插入到最终的Mysql表中。

同样,这目前有效。但是,我需要应用一些额外的逻辑并循环我的插入,以便我可以确定是否更新或插入记录。

我在下面的while循环中有一些注释行,为我需要做的事情提供伪代码方法,它包括工作插入。有了以下几点,我假设sku_id and dealer_id的假设唯一索引/组合 基本上,我需要解决以下几点:

  1. 在while循环中,查询mysql'展示位置'首先查看sku_id和经销商的组合是否存在记录。 (所以我必须从我的db2选择中迭代每个保留的记录并检查是否存在该sku / dealer组合存在的任何记录)
  2. 如果没有该sku_dealer组合的记录,那么我只会进行插入。但是,我需要插入一些等于' QUANTITY'的值的记录。来自DB2查询。所以插入相同的记录(我知道这是多余的,但这是它的原因)n次,直到n = QUANTITY
  3. 如果存在sku / dealer组合的记录,今天/ curdate()在expire_date之前是那些记录,那么更新那些现有记录,仍然确保行/记录的数量=' QUANTITY&#的值39;从上面。
  4. 否则,如果记录存在,但今天/ curdate()已过期,则执行步骤2中的插入,确保行计数= QUANTITY
  5. 我认为应该清除它,但是我的循环中的伪代码可能有助于澄清这一点。

    我只是需要一些指导,也许我已经看了很长时间,因为我已经到了这一步。但是,将新循环和逻辑应用于现有代码以实现这些要点或至少走上正确的道路的好方法是什么?这将每天运行,我现在不关心效率,我只需要让它工作,我可以在以后解决速度或性能。

    非常感谢任何想法,建议或指导。

    这是脚本的其余部分:

    //prepare and execute on db2
    $prep = odbc_prepare($DB2Conn, $plcQueryDB2);
    $exec = odbc_execute($prep);
    $result = odbc_exec($DB2Conn, $plcQueryDB2);
    
    try{
    
        while($arr = odbc_fetch_array($result)) 
        {
    
            //loop and query the placements table to see if a record exists for the sku_id/group_id/dealer_ID
    
    
            //if it exists and curdate() < expire_date and row_count = locations
    
                // update starting with oldest expire_date
    
            //else if row_count < locations
    
            $stmt = $PDO->prepare("
                INSERT IGNORE INTO placements (sku_id, group_id, dealer_id, start_date, expire_date, locations, order_num)
                    SELECT 
                        id, 
                        sku_group_id, 
                        :DEALER, 
                        DATE_ADD(DATE_FORMAT(CONVERT(:SHIPDATE, CHAR(20)), '%Y-%m-%d'),INTERVAL 7 DAY) as start_date,
                        DATE_ADD(DATE_FORMAT(CONVERT(:SHIPDATE, CHAR(20)), '%Y-%m-%d'),INTERVAL 127 DAY) as expire_date, 
                        :QUANTITY,
                        :INVOICE  
                    FROM skus s
                        WHERE  s.frame=:FRAME AND s.cover1=:COVER AND s.color1=:COLOR 
            ");
    
            $PDO->beginTransaction();
            $i = 0;
            while($db2row = odbc_fetch_array($result)) {
    
                if(++$i % 1000 == 0) {
                    $PDO->commit();
                    $PDO->beginTransaction();
                }
                $stmt->execute($db2row);
            }
            $PDO->commit();
        }
    }catch (PDOException $e){
        print "ERROR!: " . $e->getMessage() . "<br/>";
        die();
    }
    

    这也可能有助于更新/插入背后的逻辑:

    如果尝试插入此记录:

    sku_id   |   group_id   |   dealer_id   |   start_date   |   expire_date      |   locations
    -------------------------------------------------------------------------------------------
    123         10              15              2018-02-02     (start + 127 days)      3
    

    如果已经存在同一个sku / group / dealer组合(123/10/15)的任何记录,并且当前日期在expire_date之前,那么我们将更新。

    如果这些记录的expire_date已经过去,我们将插入3条新记录(因为位置的值为3)

    所以对于以下记录:

    sku_id   |  dealer_id   |   locations
    --------------------------------------
    123         10              3
    123         10              3
    123         10              3
    

    逻辑会说&#34;已经有假设的唯一索引sku_id / group_id / dealer_id(123/10/15)并且过期日期已过,所以插入3条记录

    sku_id   |   group_id   |   dealer_id   |   start_date   |   expire_date      |   locations
    -------------------------------------------------------------------------------------------
    123         10              15              2018-02-02     (start + 127 days)      3
    

    否则,如果上述3条记录的expire_date为2018-05-01,那么我们将使用新的expire_date(start_date + 127天)更新每一行

0 个答案:

没有答案