基于修改的列对Mysql结果进行排序

基于修改的列对Mysql结果进行排序,mysql,regex,perl,Mysql,Regex,Perl,我有一个mysql查询,它输出6列相关数据,我特别感兴趣的是按某个修改列的字母顺序对结果进行排序。该列中未修改的结果如下所示: ... | 0001: Some text here |... ... | 0002: Flipped text here |... ... | 0003: About some more text |... “0001:”部分不应显示。目前,我有一个Perl子例程,可以将该部分从显示中删除,但我不知道如何根据结果列按字母顺序对所有行进行排序。

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

... | 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\u name([2])“cmp”\L$b->out\u name([2])”}@$data;
$Response->Write($a.“,”.out_name($name)。”、“$c.”、“$d.”、“$e.”、“$f.”
); }
任何帮助或想法都将不胜感激,谢谢


编辑:我没有注意到,“0001:”部分可能显示为“511:”或“85000:”,该数字不是恒定长度。如果有办法在Mysql中处理这种情况,那就太好了。这在我的搜索中似乎不可能,因此我尝试使用Perl进行排序。

您可以让数据库为您进行排序:

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

下面是对
@$data
相关内容的解释。DBI方法

$data = $sth->fetchall_arrayref();
返回对行数组的引用,其中每个行都是对列数组的引用。foreach使用解引用遍历第一个arrayref(我使用的是更具描述性的变量名)

然后使用列表分配和取消引用将每一行分解为单独的列

($a, $name, $c, $d, $e, $f) = @$row_ref;
您的排序尝试失败,因为您试图分别对每一行进行排序。应该是这样的

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

还考虑对Mark Byers提出的数据库查询级别进行排序,这可能是更好的方法。

对数据库排序可能会更快,但是如果您想/必须在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数组中感兴趣列的位置,硬编码索引并不理想。

@$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
的方法在语法上是有效的,但会让人困惑)

我的第一个建议是将此列放在两个不同的列中。加入它们总是比动态地将它们分开容易。

为什么要标记为
asp classic
?我正在使用classic asp/PerlScript显示到网页上。我不确定是否应该包含标记,这是一般性的错误。这很公平,我没有发现
响应->写入
@thirtydot:我删除了标记,这真的与经典ASP无关。有没有可能是正则表达式,而不是常量字符计数?初始数字的大小可能会随着时间的推移而变化。不是regexed,而是:
按子字符串排序(yourcolumn,instr(yourcolumn,“:”)+2)
@ysth:谢谢,现在似乎可以了。在没有+2的情况下,这似乎是可行的,有什么特别的理由让+2留在里面吗?没有,没有任何理由,除非你在没有引导的情况下准确地说出你所说的:“谢谢你的解释,我正试着让它作为备份工作。遇到以下问题:
foreach my$row\u ref(sort{out\u name($a->[1])cmp out\u name($b->[1])}@$data)
所有结果都是最后一个结果,乘以原始结果数。我把这个foreach放在前一个foreach之外(并在后面)。任何额外的注释都将不胜感激。@slitonous-排序必须在外部foreach循环中,因为您需要对所有行进行排序
$a
$b
变量是两行的别名,可以进行比较,我的示例显示了由
out\u name
函数处理的第二列的比较。如果你需要更多的帮助,请发布一些你的代码。不幸的是,我没有这个选择。
@sorted_data = sort {
    my ($x) = ($a->[1] =~ m/^\d+: (.*)/); 
    my ($y) = ($b->[1] =~ m/^\d+: (.*)/);
    $x cmp $y;
} @$data;

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