MySQL - Perl- Order by - 如何显示ABS(PartNum)DESC但是,三个不同的(PartNum)类别?

时间:2011-02-16 21:57:46

标签: mysql perl sorting

抱歉我的语法不准确。新的。

我需要在三个不同的组中选择部件号。

每组的数量不同。

每组分别对ABS desc进行排序。

my $fromrow = CGI::param('from');## vague but put here to show a sort of pagination  ## 
my $nextrow = CGI::param('next');
my $grabpartnumbers = $hookup->prepare(qq{
   SELECT `New`,`Used`,`NOS`,`PartNum`,`Description`,`Price`
   FROM `Partstable`
   WHERE `instock` = ? AND `QTY` > ? AND `New` = ?
   ORDER BY ABS(PartNum) LIMIT ?,?});
$grabpartnumbers->execute('1','10','1',$fromrow,$nextrow);
while(@row = $grabpartnumbers->fetchrow_array()) {
#do stuff

适用于一个“列”,例如“新”。 但是,我希望显示如下:

新股 4结果

NOS 6结果

二手股票 10结果

当三个“列”中的一个没有更多数据要显示时,我将出现其他问题。那时,我只想显示剩余的结果或者什么都没有(甚至不是标题标题)如果该猫的结果= 0。

这是可能的还是我需要准备三个不同的查询,并可能将每个查询推送到自己的数组中来解读在某些循环中显示的内容?

这对我来说非常先进,请详细说明。 (愚蠢到我的理解水平( - ;)

谢谢..

编辑:

我的Partstable行看起来像

   ID|PartNum|New|Used|NOS|Qty|instock|Description|Price
    1|132452 |1  |0   |0  | 24|y      |12ax7 yada |3.00

我想按“重要性”的顺序在同一页面上显示三个“区域”。 “新”优先。

新股4结果

NOS 6结果

二手股票10结果

1 个答案:

答案 0 :(得分:1)

您需要实现的内容有点难以准确理解,但看起来您可能会使用完整的SQL解决方案(巧妙地使用GROUP BY等)。

关于使用Perl的当前解决方案,并假设我正确理解了您的示例,这样的内容可以作为您开始使用并适应实际数据集的起点。

警告:代码仅针对语法进行测试!

my $fromrow = CGI::param('from');## vague but put here to show a sort of pagination  ## 
my $nextrow = CGI::param('next');

# Columns of interest, sorted by descending order of importance
my @interesting_columns = qw(
    New
    Used
    NOS
    PartNum
    Description
    Price
);

my $interesting_columns_expr = join(', ', map { $_ = "`$_`" } @interesting_columns);
my $grabpartnumbers = $hookup->prepare(qq{
    SELECT $interesting_columns_expr
    FROM `Partstable`
    WHERE `instock` = ? AND `QTY` > ? 
    ORDER BY ABS(PartNum) LIMIT ?,?
});
$grabpartnumbers->execute('1','10',$fromrow,$nextrow);

# Compute results
my %result_counter;
while ( my $row = $grabpartnumbers->fetchrow_hashref() ) {
    foreach my $column_name ( keys %$row ) {
        $result_counter{$column_name} += $row->{$column_name};
    }
}

# Display results
for my $column_name ( @interesting_columns ) {
    if (exists $result_counter{$column_name}) {
        print join( ':', $column_name, $result_counter{$column_name} );
    }
}