使用Perl将多个逗号分隔的值添加到MySQL行
我有一段代码:使用Perl将多个逗号分隔的值添加到MySQL行,mysql,perl,Mysql,Perl,我有一段代码: if (my $ref = $sth->fetchrow_hashref()) { my $related_id = $ref->{'products_id'}; my $sql = "REPLACE INTO products_xsell (products_id, xsell_id) VALUES (".$product_id.", ".$related_id.")"; $dbh->do($sql); $c_
if (my $ref = $sth->fetchrow_hashref()) {
my $related_id = $ref->{'products_id'};
my $sql = "REPLACE INTO products_xsell (products_id, xsell_id)
VALUES (".$product_id.", ".$related_id.")";
$dbh->do($sql);
$c_processed++;
}
目前,数据如下所示:
product_id product_id
9999 22
8888 21
9999 66
7777 77
9999 88
product_id product_id
9999 22,66,88
8888 21
7777 77
我想这样存储数据:
product_id product_id
9999 22
8888 21
9999 66
7777 77
9999 88
product_id product_id
9999 22,66,88
8888 21
7777 77
我一直在读关于使用JOIN的书,但似乎不知道如何使用它。我继承了这段代码,它没有使用准备好的语句和占位符。
我希望在掌握了Perl的诀窍后能够解决这个问题。我要提醒大家,当您拥有一个数据库时,不要使用Perl中的“数据模糊不清”——几乎是不变的,最好使用“数据库端”——毕竟,这就是数据库的用途 但要回答您的一般问题-您需要的是哈希:
#!/usr/bin/env perl
use strict;
use warnings;
#our hash
my %combined;
#header row - grabs first line and prints it.
print scalar <DATA>;
#iterates line by line
while ( <DATA> ) {
#removes linefeeds
chomp;
#splits on whitespace.
my ($key, $value ) = split;
#stores in combined hash of arrays.
push ( @{$combined{$key}}, $value );
}
#cycle through our hash, extracting each key and
#merge the array into a string, comma delimited.
foreach my $prod ( sort keys %combined ) {
print join ("\t", $prod, join ( ",", @{$combined{$prod}} ) ),"\n";
}
__DATA__
product_id product_id
9999 22
8888 21
9999 66
7777 77
9999 88
假设您的db查询返回一个hashref,那么您就不需要像上面那样使用“split”部分——因为您已经有效地完成了这一部分。这段代码旨在说明这项技术,尤其是因为我没有您的数据库,所以我们得到了一个可运行的示例 在尝试像这样更改数据之前,您可能需要确保熟悉模式。这里的示例表看起来很像一个外键映射表,用于将表a中的项映射到表B中的项,反之亦然,如果是这样的话,您想做的事情将不会真正起作用。您提出的是一种非常糟糕的数据存储方式。除非你的老板拿枪指着你的头强迫你用这种方式格式化数据,否则我建议你重新考虑你的设计。你可以在这个网站上问一个关于如何格式化数据以满足你的需要的问题。