在perl中关联2个表值

时间:2010-09-20 21:08:35

标签: mysql perl

我在mysql数据库中有2个表:CUSTOMER和GROUP

CUSTOMER表:

  NAME |PHONE
  A    |222
  B    |333 
  C    |777
  D    |888
  E    |111
  F    |555

等等。

GROUP表只有3个值:

  GN   | NUM
  NEW  |807
  OLD  |455 
  INT  |504

我想得到以下结果:

  A, NEW, 807
  B, OLD, 455
  C, INT, 504
  D, NEW, 807
  E, OLD, 455
  F, INT, 504

依旧......

GROUP表必须重复,直到CUSTOMER表结束。

这是我的代码:

#!/usr/bin/perl

# PERL MODULES
use DBI;
use strict;
use warnings;


# MYSQL CONFIG VARIABLES
my $dsn = 'DBI:mysql:test:127.0.0.1';
my $tablename = "CUSTOMER";
my $user = "root";
my $pw = "xxxx";
# DEFINE A MySQL QUERY
my $myquery1 = "SELECT  NAME FROM $tablename";

# PERL CONNECT()
my $dbh = DBI->connect($dsn, $user, $pw);
# EXECUTE THE QUERY
my $getname = $dbh->prepare($myquery1); 
$getnum->execute(); 

my $getlogin = $dbh->prepare("select * from GROUP"); 
$getlogin->execute();
my($login, $password);
# FETCHROW ARRAY
while (my $name = $getname->fetchrow_array()) {

    while (my @row = $getlogin->fetchrow_array()) {
     my ($gn,$num) = @row;
        $login=$gn;
        $password=$num;

        print "$name\t\t $login \t\t $password \n";

    }


} 

当我执行我的代码时,我得到:

  A NEW 807
  B OLD 455
  C INT 504

  DBD::mysql::st fetchrow_array failed: fetch() without execute() at ./main.pl line 29.

我该怎么做? 任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:3)

首先,你有一个拼写错误 - 你正在做$getnum->execute()而不是$getname->execute()。你真的运行了你粘贴的确切代码吗?

您在第三次迭代后遇到错误,因为GROUP表中只有三行数据。您需要使用新查询再次启动循环(在第一个while循环内执行execute(),在启动第二个循环之前),或者将其所有数据缓存到可以重复循环的数组中: / p>

my $getname = $dbh->prepare($myquery1); 
my $getlogin = $dbh->prepare("select * from GROUP"); 

# FETCHROW ARRAY
$getname->execute(); 
while (my $name = $getname->fetchrow_array())
{
    $getlogin->execute();
    while (my @row = $getlogin->fetchrow_array())
    {
        my ($gn,$num) = @row;
        my $login=$gn;
        my $password=$num;

        print "$name\t\t $login \t\t $password \n";
    }
} 

答案 1 :(得分:0)

问题是您在处理完所有元素后正在调用$getlogin->fetchrow_array。当CUSTOMER循环执行第二次迭代时会发生这种情况。你应该在CUSTOMER循环开始时调用$getlogin->execute。像这样:

while (my $name = $getname->fetchrow_array()) {
    ## start new query each time we want to loop GROUP table
    my $getlogin = $dbh->prepare("select * from GROUP"); 
    $getlogin->execute();
    while (my @row = $getlogin->fetchrow_array()) {

但是这会破坏脚本的性能。我建议您在CUSTOMER循环到数组之前选择所有GROUP,并使用它而不是每次迭代从DB加载数据。

答案 2 :(得分:0)

听起来你只是希望CUSTOMER表中的行被分配交替的值,在GROUP表中旋转 - 而你并不关心谁获得了什么值(或者你将ORDER放入SELECT中)

我要做的是:在GROUP表中添加一个值为0,1和2的列;给CUSTOMER表一个递增的id;并加入它们(CUSTOMER.id%3 = GROUP.id)。这样就可以按照我想的方式将GROUP值向下旋转到CUSTOMER表中。

ALTER TABLE `GROUP` ADD COLUMN id INT UNSIGNED NOT NULL, ADD INDEX idx_id (id);
UPDATE GROUP SET id=0 WHERE GN='NEW';
UPDATE GROUP SET id=1 WHERE GN='OLD';
UPDATE GROUP SET id=2 WHERE GN='INT';
ALTER TABLE `CUSTOMER` ADD COLUMN
    id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT;

然后它只是一个SELECT来获得你想要的配对:

SELECT NAME, GN, NUM FROM `GROUP`, CUSTOMER WHERE GROUP.id = CUSTOMER.id % 3;

(P.S。我建议不要将表命名为“GROUP”这样的SQL关键字,每次使用它时都必须引用它。)