mysql perl选择连接和更新表

时间:2015-02-08 12:35:55

标签: mysql perl

我有3个表,如下所示,我想要帮助的是理解连接(如果需要)来执行以下查询:

我的产品在产品表(id,1)中也可在Deal Table(product_id,1)中使用,其tariff_id为10.因为Tariff表中的长度为0,我不会更新。< / p>

产品表(id,2)。它也可以在交易表(product_id,2)中获得,其关税数据为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种产品和100万笔交易。 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;

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

对你正在做的事情进行轻微修改,第一个查询连接所有三个表,从加权表中加总长度(如果没有,它将为null或零)。然后迭代结果更新products表。

之前提供的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;