mysql perl 选择连接和更新表

标签 mysql perl

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

我的产品在 Product 表 (id,1) 中,它在 Deal 表 (product_id,1) 中也可用,它的 tariff_id 为 10。因为 Tariff 表中的长度为 0,所以我不更新可用。

产品表 (id,2)。它在 Deal Table (product_id,2) 中也可用,它的 tariff_id 为 15。因为 Tariff 表中的长度为 24 (>0),我需要将 available 更新为 1。

产品表 (id,3) 在产品表和交易表中,但在交易表中它有 2 个关税(25 和 10)。这次又是因为其中一个关税的长度是 12 (>0),我需要更新 available 到 1。

与上面的 Product 表 (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) 该产品是否存在于 Deals 表中。 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;

关于mysql perl 选择连接和更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28393986/

相关文章:

mysql - R - 从文件中读取特定行

mysql - 对同一个表中的子/父进行排序

perl - 为应用程序设计错误消息系统的最具可扩展性/可扩展性的方法是什么?我将使用 Perl。

python - 创建文件夹或文件时运行脚本

php - php中不区分大小写的查询

mysql - #1064 - 您的 SQL 语法有误; , SAMP MYSQL 错误

perl - 我如何说服 cpanminus 在 lib/而不是 lib/perl5 中安装模块?

perl - eval{} 语句中 If() 语句后空 {} 的定义

perl - 为什么我无法在 CGI 脚本中获取 cookie?

mysql - 在 DynamoDB 中创建一个表,并使用 2 "columns"作为键(复合键)