簡體   English   中英

mysql perl選擇聯接和更新表

[英]mysql perl select join and update tables

我有3個表,如下所示,我想要幫助的是理解聯接(如果需要)以執行以下查詢:

我的產品在“產品”表(id,1)中,在“交易”表(product_id,1)中也可用,它的riff_id為10。由於“關稅”表中的長度為0,因此我無法更新。

產品表(id,2)。 在Deal Table(product_id,2)中也可以使用它,其riffit_id為15。由於Tariff表中的長度為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多種產品和100萬筆交易。 product_id可以在交易表中出現數百次。 因此,我想如果我從“產品表”中選擇一個產品並將其傳遞給第二個查詢,則第二個查詢將檢查是否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;

任何幫助將不勝感激。

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;

稍微修改一下您正在執行的操作,第一個查詢將所有三個表連接起來,匯總關稅表的長度(如果沒有,則為null或零)。 然后遍歷結果,更新產品表。

較早提供的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM