[英]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.