我前几天发布了一个关于这个脚本/查询的问题,但它是关于严格能够插入值,而不是包括新逻辑。
我目前有一个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
的假设唯一索引/组合
基本上,我需要解决以下几点:
我认为应该清除它,但是我的循环中的伪代码可能有助于澄清这一点。
我只是需要一些指导,也许我已经看了很长时间,因为我已经到了这一步。但是,将新循环和逻辑应用于现有代码以实现这些要点或至少走上正确的道路的好方法是什么?这将每天运行,我现在不关心效率,我只需要让它工作,我可以在以后解决速度或性能。
非常感谢任何想法,建议或指导。
这是脚本的其余部分:
//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天)更新每一行