2014-03-24 64 views
0

我導入CSV兩列到現有的表使用PHP(我使用Joomla/Virtuemart)插入MySQL表與子查詢

在現有的表中的列的另一個表的ID(用戶ID)和product_id。

CSV文件中的列是product_sku和用戶名,所以我需要首先連接到相應的表以將id(用戶標識)與用戶名匹配,並將proudct_sku與product_id匹配。 我還需要關閉用戶名前導零,以及我使用sql完成的productsku中的空格。

我創建了一個臨時表,其中包含CSV中的數據,然後加入到兩個表中。我有我需要的數據,但現在需要將數據插入到現有表中。理想情況下,我想用mySQL來做到這一點,是否有可能作爲子查詢做到這一點?

會有速度差異嗎?

function do_query($file) 
{ 

    // $sql = "LOAD DATA INFILE ".$file['tmp_name']." INTO TABLE FavouritesTmp FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (data1, data2)"; 

    $sql = "CREATE TEMPORARY TABLE FavouritesTmp (
       productsku VARCHAR(50) NOT NULL, 
       user VARCHAR(50) NOT NULL 
     )"; 
    $this->_db->setQuery($sql); 
    $this->_db->query(); 
    $handle = fopen($file['tmp_name'], "r"); 
    do 
    { 
     if ($data[0]) 
     { 
     $sql = "INSERT INTO `FavouritesTmp` (productsku, user) VALUES 
        ( 
         '" . $data[0] . "', 
         '" . $data[1] . "' 
        ) 
       "; 
     $this->_db->setQuery($sql); 
     $this->_db->query(); 
     } 
    } 

    while ($data = fgetcsv($handle, 1000, ",", "'")); 
    $sql = "SELECT TRIM(LEADING '0' FROM user) AS username, 
     productsku AS productsku, 
     jos_users.id AS id, 
     jos_vm_product.product_id AS product_id 
     FROM FavouritesTmp 
     LEFT JOIN jos_users ON ( TRIM(LEADING '0' FROM username) = jos_users.username) 
     LEFT JOIN jos_vm_product ON TRIM(productsku) = jos_vm_product.product_sku"; 
    $this->_db->setQuery($sql); 
    print_r($this->_db->loadAssocList()); 
} 

回答

1

你可以用insert . . . select語法:

INSERT INTO ExistingTable(username, productsku, id, product_id) 
    SELECT TRIM(LEADING '0' FROM user) AS username, 
      productsku AS productsku, 
      jos_users.id AS id, 
      jos_vm_product.product_id AS product_id 
    FROM FavouritesTmp 
    LEFT JOIN jos_users ON ( TRIM(LEADING '0' FROM username) = jos_users.username) 
    LEFT JOIN jos_vm_product ON TRIM(productsku) = jos_vm_product.product_sku;