我有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;
非常感谢任何帮助。
答案 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;