Сортировка результатов Mysql по измененному столбцу - PullRequest
0 голосов
/ 18 марта 2011

У меня есть запрос 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, просто знаю, как это работает.Моя неудачная попытка сортировки закомментирована #.

$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.

Ответы [ 5 ]

2 голосов
/ 18 марта 2011

Вы можете получить базу данных для сортировки за вас:

SELECT ...
FROM yourtable
ORDER BY SUBSTR(yourcolumn, 5)
0 голосов
/ 19 марта 2011

Мое первое предложение - держать этот столбец в двух разных столбцах.Присоединиться к ним всегда проще, чем динамически разделять их.

0 голосов
/ 18 марта 2011

@$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 голосов
/ 18 марта 2011

Сортировка базы данных для вас, вероятно, будет быстрее, но если вы хотите / должны сделать это в 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 голосов
/ 18 марта 2011

Вот объяснение @$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) {
     ....
}

Также рассмотрите возможность сортировки по уровню запросов к базе данных, предложенному Марком Байерсом, возможно, это лучший подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...