免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3691 | 回复: 2
打印 上一主题 下一主题

关系到数据库的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-13 23:48 |只看该作者 |倒序浏览
#!/usr/bin/perl -w
use strict;  
use warnings;
use DBI;
use Encode;
use strict;
use Time::localtime;
use Data:umper;
use Time::Local;
use Spreadsheet:arseExcel;  
use Spreadsheet::WriteExcel;
use Spreadsheet:arseExcel::FmtUnicode;
use Encode;

my $parser = new Spreadsheet:arseExcel;
my $oCode = "cp936";
my $oFmtJ = Spreadsheet:arseExcel::FmtUnicode->new(Unicode_Map => $oCode);

my $workbook = Spreadsheet::WriteExcel->new('Products.xls');
my $worksheet = $workbook->add_worksheet();   

my $format = $workbook->add_format();  
$format->set_bold();
$format->set_color('red');
$format->set_align('center');



my @data;
my $sth;
my $sth_a;
my $i;
my $dbh = DBI->connect( 'DBI:mysql:gs',
                        'root',
                        'welcome123',
                        {RaiseError=>1,AutoCommit=>0}
                      )
          || die "Database connection not made: $DBI::errstr";

my $inventory_a;
my @data_a;
my $row = 1;
my $inventory_b = q{
select distinct p.id, p.catalog, p.title, p.cas, p.symbol, pxx.ava, p.purity, iv.stock1, iv.stock2, iv.price1, iv.price2
from
product as p
left join pxx as pxx on pxx.id = p.id
left join inventory as iv on iv.pid = p.id
left join inventory_xx as ivxx on ivxx.pid = p.id
where p.status='Active'
};                  

$sth = $dbh->prepare($inventory_b);
$sth->execute() or die $DBI::errstr;



while(@data = $sth->fetchrow_array()) {
        for($i=0;$i<$#data;$i++) {
                        if(!defined($data[$i])) {
                                next;
                        }
       
                        if(isASCII($data[$i])) {
                                $worksheet->write($row,$i,$data[$i]);
                        } else {
                                $worksheet->write($row,$i,decode('utf16-BE',$data[$i]));
                        }
        }
       
        # get the size and price
        $inventory_a= qq{
                SELECT        `size`, `price`
                FROM `pxx` where id = '$data[0]'
        };
        $sth_a = $dbh->prepare($inventory_a);
        $sth_a->execute() or die $DBI::errstr;
        #print "$inventory_a\n";
        my $extend = 11;
        while(@data_a = $sth_a->fetchrow_array())
        {

                        for($i=0;$i<=$#data_a;$i++) {
                                $extend = $extend + 1;
                                if(!defined($data_a[$i])) {
                                        next;
                                }
                                #print "$data_a[$i]\n";
                                if(isASCII($data_a[$i])) {
                                        $worksheet->write($row,$extend,$data_a[$i]);
                                } else {
                                        $worksheet->write($row,$extend,decode('utf16-BE',$data_a[$i]));
                                }
                        }
        }
       
        $sth_a->finish();

        #$dbh->disconnect();
       
        $row++;
}
                  

$sth->finish();

$dbh->disconnect();


sub isASCII {
    for my $v ( split(//,$_[0]) ) {
        return 0 if (ord($v) == 0);
    }
    return 1;
}

论坛徽章:
0
2 [报告]
发表于 2014-04-13 23:49 |只看该作者
这里数据库共有10w个产品,数据量不大,但是涉及到了多表查询,我用了left join,效果很差,直接把数据库跑死了,请大神们帮忙

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
3 [报告]
发表于 2014-04-14 06:34 |只看该作者
1.先用mysql客户端跑跑看,出的结果有无问题.
2.为何要加distinct?pid不是主键?
3.查询的结果集里面为何还要循环再作查询?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP