我有 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/