【问题标题】:Using DB2 query to join into mysql data for insert使用 DB2 查询加入 mysql 数据以进行插入
【发布时间】:2018-07-30 03:06:17
【问题描述】:

我正在尝试在 php 中获取一个脚本,该脚本使用 sql 从 DB2 获取查询,然后通过将其等同于另一个连接中的 mysql 表中的数据来使用该结果集,并将基于该结果的结果插入另一个.

基本上,我的 db2 查询返回几个字段,这些字段是确定 My SQL 中表的 ID 所需要的

下面我有一个例子:

我从这里选择: DB2 查询结果

Dealer | Style | Frame | Cover | Color | Placements | shipdate
---------------------------------------------------------------
123        1      1234    12       1         2         20180219
123        2      1235    12       1         2         20180219
123        3      1236    12       1         2         20180219

我需要在某种意义上将前面的数据加入到后面的数据中 SKU 表(db2.style = sku.groupID、db2.frame = sku.frame、db2.cover = sku.cover 和 db2.color = sku.color)以获取正确的 ID

ID | Frame | GroupID | cover | color 
------------------------------------
15    1234      1        12      1
16    1235      2        12      1
17    1236      3        12      1

然后在下面,我需要插入先前确定的 ID,以及原始 DB2 查询中的一些数据(将 style 插入 groupID,dealer 插入dealerID,shipdate 插入 startdate,placement 插入placement)

INSERT 将导致:(skuplacement 表)

sku_id | groupID | dealerID | startDate | expirationDate          | placements
------------------------------------------------------------------------------
15          1       123        20180226    (shipdate + 127 days)       2
16          2       123        20180226    (shipdate + 127 days)       2
17          3       123        20180226    (shipdate + 127 days)       2

我希望这是有道理的。

我现在已经包含了我的完整脚本,但是我的 MYSQL 的 INSERT/SELECT/JOIN 丢失了。我现在不知道该怎么做,但我的两个连接都在工作。这只是创建正确查询的问题。

我很乐意回答任何问题以消除困惑。

            <?php


            //Establilsh MySql Connection
            $mysqlConn = new mysqli($mysqlServer, $mysqlUser, $mysqlPass);

            //Check MySQL connection
            if($mysqlConn->connect_error){
              die("Connection Failed: " .$mysqlConn->connect_error);
            }
            echo "Connected Succssfully to Mysql";

            //Establish DB2 connection
            $DB2Conn = odbc_connect();

            //Check DB2 Connection
            if(!$DB2Conn){
              die("Could not connect");
            }else{
                echo"Connected to DB2";
            }



            $plcQueryDB2 = "

                   select
                        xcstno as dealer,
                        p.style as Style,
                        trim(p.framfmt) as Frame,
                        p.cover1 as Cover,
                        p.color1 as Color,
                        sum(skunoc) as placements,
                        p.extd1d as shipdate
                    from pieces p
                    where left(shipdate, 4) >= '2016'
                    group by xcstno, xslsno, sup, f.style, f.grpnam, f.framfmt, f.cover1, f.color1, f.coldss,a.extd1d
                    order by left(shipdate, 4) ASC, REP
                ";

            $prep = odbc_prepare($DB2Conn, $plcQueryDB2);
            $exec = odbc_execute($prep);

            $result = odbc_exec($DB2Conn, $plcQueryDB2);

            if(!$prep){
                die("Could Not Run Query");
            }else{
                echo "DB2 Query Successful";
            }


            while(odbc_fetch_row($result)){
                     for($i=1;$i<=odbc_num_fields($result);$i++){
                    echo "Result is ".odbc_result($result,$i);
                }
            }


            /*Need to get an INSERT created here*/

            $InsertSKUS = "

                    INSERT INTO skuPlacement
                    values (?,?,?,?,?,?)     
            ";

            /* This is my problem. I need to select from another table called skus and insert into skuPlacement based on equating fields from my previous DB2 query and the skus table*/


            ////*CLOSE CONNECTIONS*////


            if (mysqli_close($mysqlConn)){
                echo "MySQL Closed";
            }

            //$CloseDB2 =  odbc_close( $DB2Conn);

            if(odbc_close( $DB2Conn)){
                echo "DB2 Closed";
            }





            ?>

【问题讨论】:

  • 请尝试从您的代码中删除无休止的空白行。它越紧凑,就越容易理解发生了什么。
  • 对,对不起.......这是一个巨大的疏忽,我应该再清理一下
  • 没什么大不了的,但保持整洁意味着您正在努力使事情尽可能小而专注。

标签: php mysql sql db2


【解决方案1】:

考虑将 DB2 查询结果保存到 csv 文件。然后使用LOAD DATA INFILE(一种快速的批量工具)将 csv 文件导入 MySQL 并在 MySQL 中运行所需的 join append 查询:

DB2 查询 CSV

try {
    $DB2Conn = odbc_connect();

    $plcQueryDB2 = "...";
    $prep = odbc_prepare($DB2Conn, $plcQueryDB2);
    $exec = odbc_execute($prep);
    $result = odbc_exec($DB2Conn, $plcQueryDB2);
}
catch(Exception $e) {  
    echo $e->getMessage();  
} 

// Writing column headers
$columns = array('Dealer', 'Style', 'Frame', 'Cover', 'Color', 'Placements', 'shipdate');
$fs = fopen('DB2_Query.csv', 'w');
fputcsv($fs, $columns);      
fclose($fs);

// Writing data rows
while($arr = odbc_fetch_array($result)) {
    $fs = fopen('DB2_Query.csv', 'a');
      fputcsv($fs, $arr);
    fclose($fs);
}

odbc_close($DB2Conn);
$DB2Conn = null;

MySQL 查询(在 PHP 或控制台中单独运行)

$mysqlConn->query("CREATE TABLE IF NOT EXISTS db2Temp (
                       dealer INTEGER,
                       style INTEGER,
                       frame INTEGER,
                       cover INTEGER,
                       color INTEGER,
                       placements INTEGER,
                       shipdate DATE
                  )");

$mysqlConn->query("DELETE FROM db2Temp");

$mysqlConn->query("LOAD DATA LOCAL INFILE /path/to/DB2Query.csv
                   INTO TABLE db2temp
                   FIELDS TERMINATED BY ','
                   OPTIONALLY ENCLOSED BY '\"'
                   LINES TERMINATED BY '\n'
                   IGNORE 1 LINES");

$mysqlConn->query("INSERT INTO skuPlacement (sku_id, groupID, dealerID, startDate,
                                             expirationDate, placements)
                   SELECT sku.ID, sku.Group_ID, db2.dealer, db2.shipDate,
                          DATE_ADD(
                               DATE_FORMAT(CONVERT(db2.shipDate, CHAR(8)), '%Y-%m-%d'), 
                               INTERVAL 127 DAY) as expirationDate,
                          db2.placements
                   FROM sku
                   INNER JOIN db2temp db2
                   ON db2.style = sku.groupID
                   AND db2.frame = sku.frame
                   AND db2.cover = sku.cover
                   AND db2.color = sku.color
                   WHERE NOT EXISTS                  
                      (SELECT 1 FROM skuPlacement p
                       WHERE sku.ID = p.sku_ID)");

【讨论】:

  • 哇,这看起来是一个很好的答案,但我在移动设备上,所以我必须在几个小时内尝试应用它。作为我团队的概念证明,我是否也可以使用数组来代替 csv 做类似的事情?我更喜欢这种方法,只是想办法应用
  • 虽然数组是用于键/值配对的哈希表,但它们不像数据库中那样基于集合、行/列表。所以你不会利用索引连接。 CSV 只是一种构建临时表以将一个数据库中的表连接在一起的媒介,避免嵌套 for 循环遍历所有行并检查它们是否与其他数组项相等。分块处理通常更易于维护/健壮/高效。
  • 再次感谢您的帮助。我将其作为脚本定期运行,作为将新数据从旧数据库获取到新数据库的一种方式,最明智的做法是按计划将第一部分作为脚本运行并确保第二部分运行之后?
  • while(odbc_fetch_row($result)){ 行也给了我错误,它期望参数 1 是资源
  • 可以,都可以按顺序定时运行。我更新以展示如何在 PHP 中运行查询。至于while(...),我忘了复制$result = ... 行。见编辑。此外,请检查您的 shipdate 的类型,因为它不是真正的日期格式:YYYY-MM-DD。它是整数还是字符串?如果是这样,您需要转换为DateAdd() 函数的实际日期时间。
猜你喜欢
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多