2015-02-08 55 views
0

我有3個表格,如下所示,我想幫助的是理解連接(如果需要)執行以下查詢:mysql perl select加入和更新表格

我的產品是在產品表(id ,1)交易表(product_id,1)中也有它的tariff_id爲10.由於關稅表中的長度爲0,因此我沒有更新可用。

產品表(id,2)。它也可用於交易表(product_id,2)中,其關稅ID爲15.由於關稅表中的長度爲24(> 0),因此我需要將其更新爲1.

產品表(id,3 )在產品表和交易表中,但在交易表中它有2個與其關聯的關稅(25和10)。這次再次因爲關稅的長度是12(> 0),我需要更新爲1。

與上述產品表(ID,4)完全相同。

產品表(id,5)。不在交易表中,因此不需要更新。

Product table 
------------------------- 
    id | pm_available 
------------------------- 
    1   0 
    2   0 
    3   0 
    4   0 
    5   0 

Deal Table 
------------------------------------------ 
    id | product_id | tariff_id 
------------------------------------------ 
    1    1    10 
    2    2    15 
    3    3    25 
    4    3    10 
    5    4    20 
    6    4    25 
    7    4    10 

Tariff table 
---------------------------- 
    id  | length 
---------------------------- 
    10   0 
    15   24 
    20   0 
    25   12 

更新產品表應該是這樣的

Product table 
------------------------- 
    id | pm_available 
------------------------- 
    1   0 
    2   1 
    3   1 
    4   1 
    5   0 

有超過3000的產品1萬筆。一個product_id可以出現在Deals表中數百次。所以我想如果我從Product Table中選擇一個產品傳遞到第二個查詢中,第二個查詢將檢查1)該產品是否存在於交易表中。 2)如果它存在與其關聯的關稅。 3)檢查關稅的長度是否大於0,如果是,則更新。

我有這個當前的腳本,但它不能正常工作,我不應該更新'可用'。

my $dbh = DBI->connect($dbiconnect,$dbiuser,$dbipass,{AutoCommit=>1,RaiseError=>1,PrintError=>0}); 
my $shh = $dbh->prepare(q{SELECT id FROM products }) or die $dbh->errstr; 
my $ih = $dbh->prepare(q{UPDATE products SET available = ? WHERE id = ?}) or die $dbh->errstr; 
my $sh = $dbh->prepare(q{ 
    SELECT d.id 
    FROM deals d 
    JOIN tariffs t ON d.tariff_id = t.id 
    JOIN products p ON d.product_id = p.id 
    WHERE d.product_id = ? 
    AND t.length > 1 
    LIMIT 0,1 
}) or die $dbh->errstr; 

$shh->execute or die $dbh->errstr; 

my @data; 

while (@data = $shh->fetchrow_array()) { 

    my $id = $data[0]; 

    $sh->execute("$id"); 

    if($sh->rows > 0){ 
     $ih->execute("1", "$id"); 
     $ih->finish; 

    } else { 
     $ih->execute("0", ""); 
     $ih->finish; 

    } 
    $sh->finish; 

    usleep($delay); 
} 
$shh->finish; 

任何幫助將不勝感激。

回答

4

MySQL會爲你做所有這些 - 不需要涉及Perl或多個SQL語句。

像這樣(未經測試,因爲我目前沒有安裝MySQL服務器)。

my $update = $dbh->prepare(<<__SQL__); 
UPDATE Product 
JOIN Deal ON Product.id = Deal.product_id 
JOIN Tariff ON Tariff.id = Deal.tariff_id 
SET Product.pm_available = 1 
WHERE Tariff.length > 0 
__SQL__ 

$update->execute; 
0

輕微的mod你在做什麼,第一次查詢連接所有三個表總結從關稅表的長度(這將是空或零,如果是沒有的)。然後遍歷更新產品表的結果。

以前提供的MYSQL唯一答案假設您在與mysql服務器相同的機器上運行此腳本(如果不是,則不起作用)。我認爲它也會有潛在的問題,其中之一就是它不會在任何情況下將你的可用性設置爲0,所以一旦標記了可用,它將永遠不會失效。

my $dbh = DBI->connect($dbiconnect,$dbiuser,$dbipass,{AutoCommit=>1,RaiseError=>1,PrintError=>0}); 
my $ih = $dbh->prepare(q{UPDATE products SET available = ? WHERE id = ?}) or die $dbh->errstr; 
my $sh = $dbh->prepare(q{ 
    SELECT p.id,sum(t.length) 
    FROM ((products p 
    LEFT JOIN deals d) ON p.id = d.product_id) 
    LEFT JOIN tariffs t ON d.tariff_id = t.id) 
    GROUP BY p.id; 
}) or die $dbh->errstr; 

while (my @data = $sh->fetchrow_array()) { 
    my $id = $data[0]; 
    my $length = $data[1]; 
    if($length > 0){ 
     $ih->execute("1", "$id"); 
    }else{ 
     $ih->execute("0", "$id"); 
    } 
    $ih->finish; 
    usleep($delay); 
} 
$sh->finish;