Mysql 在perl中关联2个表值

Mysql 在perl中关联2个表值,mysql,perl,Mysql,Perl,我在mysql数据库中有两个表:CUSTOMER和GROUP 客户表: NAME |PHONE A |222 B |333 C |777 D |888 E |111 F |555 等等 组表只有3个值: GN | NUM NEW |807 OLD |455 INT |504 我希望得到以下结果: A, NEW, 807 B, OLD, 455 C, INT, 504 D, NEW,

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

客户表:

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

组表只有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
等等

组表必须重复,直到客户表结束

这是我的密码:

#!/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.
我该怎么做?
任何帮助都将不胜感激

首先,您有一个输入错误-您正在执行$getnum->execute而不是$getname->execute。你真的运行了你粘贴的代码吗

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

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";
    }
} 

问题是,在处理完所有元素后,您正在调用$getlogin->fetchrow\u数组。当客户循环进行第二次迭代时会发生这种情况。您应该在客户循环开始时调用$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()) {

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

听起来您只是希望为客户表中的行分配交替值,在分组表中旋转-您不太关心谁得到什么值,或者您会将订单放入您的选择中

我要做的是:向组表中添加一列,其值为0、1和2;给客户表一个递增的id;并在CUSTOMER.id%3=GROUP.id上加入他们。这将按照我认为正是您想要的方式在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 NAME, GN, NUM FROM `GROUP`, CUSTOMER WHERE GROUP.id = CUSTOMER.id % 3;

另外,我建议不要将表命名为SQL关键字组,每次使用时都要引用它。

你到底为什么要这样!?数据库不按顺序存储数据。从foo中选择*;每次运行时很可能返回不同的顺序。是的,我意识到我犯了一个错误,首先我调用了变量$getnum,然后在粘贴之前将其重命名为$getname。谢谢,修改没有给出预期的结果;当我跑步时,我有:A,新,807 | A,旧,455 | A,INT,504 | B,新,807 | B,旧,455 | B,INT,504 |等等。。谢谢,@Mike:我回答了你关于DBI错误的问题。我相信您可以从这里重新构造代码,以正确的组合获得所需的数据。感谢您的建议。听起来很糟糕,我在CUSTOMER表中有将近100000条记录,而在GROUP表中只有10条记录。然而,我不明白在客户循环到数组中并使用它而不是每次迭代都从DB加载数据之前,如何选择所有组?谢谢。我得到了预期的结果。谢谢!我感谢你的帮助!