我在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.
我该怎么做? 任何帮助,将不胜感激。
答案 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关键字,每次使用它时都必须引用它。)