[英]Using DB2 query to join into mysql data for insert
我正在嘗試在 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 查詢的一些數據(將樣式插入 groupID,dealer 插入dealerID,shipdate 插入 startdate,placement 插入 Places)
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";
}
?>
考慮將 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)");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.