使用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中的项,反之亦然,如果是这样的话,您想做的事情将不会真正起作用。您提出的是一种非常糟糕的数据存储方式。除非你的老板拿枪指着你的头强迫你用这种方式格式化数据,否则我建议你重新考虑你的设计。你可以在这个网站上问一个关于如何格式化数据以满足你的需要的问题。