2011-03-18 85 views
0

我有一个mysql查询,它输出6列相关数据,我特别感兴趣的是按某个修改列按字母顺序排序结果。该列的未修改结果如下所示:根据修改的列对Mysql结果进行排序

... | 0001: Some text here  |... 
... | 0002: Flipped text here  |... 
... | 0003: About some more text |... 

不应显示“0001:”部分。目前,我有一个Perl子程序从显示中删除该部分,但我不知道如何根据该结果列按字母顺序排列所有行。我正在寻找的是:

... | About some more text |... 
... | Flipped text here  |... 
... | Some text here  |... 

以下是我用来检索和显示所述数据,但我对Perl的理解是非常缺乏。我不明白@ $数据是如何工作的,只知道它的确如此。 #失败的排序尝试被注释掉#。

$data = $sth->fetchall_arrayref(); 
$sth->finish; 

foreach $data (@$data) { 
    ($a, $name, $c, $d, $e, $f) = @$data; 
    # @$data = sort { "\L$a->out_name([2])" cmp "\L$b->out_name([2])"} @$data; 
    $Response->Write($a.",".out_name($name).",".$c.",".$d.",".$e.",".$f."<br />"); 
} 

任何帮助或想法将不胜感激,谢谢。

编辑:我没有注意到,'0001:'部分可能显示为'511:'或'85000:',该数字不是一个固定的长度。如果有办法在Mysql中处理这种情况,那会很好。它在我的搜索中似乎不是一种可能性,因此我为什么要用Perl进行尝试。

+0

为什么被标记为“asp-classic”? – thirtydot 2011-03-18 19:04:16

+0

我正在使用经典ASP/PerlScript来显示到网页。不知道是否应该包括标签,错在一般性的一面。 – slitomonous 2011-03-18 19:06:42

+0

这很公平,我没有发现'Response-> Write'。 – thirtydot 2011-03-18 19:08:40

回答

2

你可以得到数据库来进行排序为您提供:

SELECT ... 
FROM yourtable 
ORDER BY SUBSTR(yourcolumn, 5) 
+0

有没有可能是正则表达式,而不是一个恒定的字符数?初始号码的大小可能随时间而改变。 – slitomonous 2011-03-18 19:16:53

+1

不是正则表达式,但是:'按子字符串排序(yourcolumn,instr(yourcolumn,':')+ 2)' – ysth 2011-03-18 19:25:59

+0

@ysth:谢谢,这似乎现在工作。这似乎没有+2,没有任何特别的理由离开+2的工作? – slitomonous 2011-03-18 21:27:30

0

这里是@$data相关的东西的解释。该方法DBI

$data = $sth->fetchall_arrayref(); 

返回参考行的阵列,其中每一个是参考列的阵列。在foreach使用解引用遍历第一个数组引用(我使用更具描述性的变量名)

foreach $row_ref (@$data) { 

这样,每行都使用列表赋值和解引用

($a, $name, $c, $d, $e, $f) = @$row_ref; 

你的那种尝试失败,因为你分解到各列试图单独对每一行进行排序。它更应是这样的

foreach my $row_ref (sort { out_name($a->[1]) cmp out_name($b->[1]) } @$data) { 
    .... 
} 

也可以考虑由马克·拜尔斯建议数据库查询级别排序,它可能是更好的方法。

+0

感谢您的解释,我试图让这个工作作为备份。遇到问题:'foreach my $ row_ref(sort {out_name($ a - > [1])cmp out_name($ b - > [1])} @ $ data)'''''''''''''''结果,乘以原来的结果数量。我在以前的foreach之外(和之后)发布了这个foreach。任何额外的意见将不胜感激。 – slitomonous 2011-03-18 21:49:42

+0

@slitomonous - 排序必须位于外部foreach循环中,因为您需要对所有行进行排序。 '$ a'和'$ b'变量是可以比较的两行的别名,我的示例显示了由'out_name'函数处理的第二列的比较。如果您需要更多帮助,请张贴您的一些代码。 – bvr 2011-03-19 06:21:12

+0

我想出了我的错误,非常感谢! – slitomonous 2011-03-19 14:35:40

0

具有数据库的排序为你可能会更快,但如果你想/必须做它用Perl,这样的事情应该工作:

@sorted_data = sort { 
    my ($x) = ($a->[1] =~ m/^\d+: (.*)/); 
    my ($y) = ($b->[1] =~ m/^\d+: (.*)/); 
    $x cmp $y; 
} @$data; 

foreach (@sorted_data) { print output } 

[1]为列的位置对@ $ data数组感兴趣,对索引进行硬编码并不理想。

0

@$data(第一个)包含了所有从你查询的结果,你应该foreach块被分类整理。

@sorted_data = sort { 
    my($x=$a) =~ s/^\d+: //; 
    my($y=$b) =~ s/^\d+: //; 
    $x cmp $y 
} @$data; 
foreach my $data (@sorted_data) { 
    ... 
}  

(二次$data@$data你做的方式是语法有效,但海拉混乱)

0

我的第一个proposision是在两个不同的列来保存此列。加入它们总是比动态分离它们容易。

+0

不幸的是,我没有这个选项。 – slitomonous 2011-03-18 21:53:01

相关问题