6

我有以下字符串:

1BG200,1M400,1BA1000

我想将上述字符串与 Desc Order 进行比较...

代码:

$sql = "SELECT * FROM collected WHERE c_no BETWEEN '".$from."' AND '".$to."' ORDER BY c_no Desc";

输出 :

1M400
1BG200
1BA1000 

它应该是 1000 更大,然后是 400、200 ..我如何比较它们?我认为比较包含整数的字符串是不对的!而且我找不到我的问题的正确解决方案?

有些人建议使用preg_matchor substr..但是你可以看到有单字符和双字符 ex ( M 和 BG )。

抱歉,我对 PHP 不是很熟悉。请帮忙!

4

5 回答 5

3

您可以使用自定义排序,仅查看数字部分

function cmp($a, $b)
{
    $numa = intval(preg_replace('/[0-9]*[A-Z]+/', '', $a));
    $numb = intval(preg_replace('/[0-9]*[A-Z]+/', '', $b));
    if($a == $b) return 0;
    return ($a < $b) ? -1 : 1;
}

//Now get the list and sort
usort($list, "cmp");
于 2013-06-24T12:37:20.017 回答
2

您可以使用preg_replace('/[0-9][A-Z]+/', '', $var)删除第一个数字和多个字母,然后使用 php usort

于 2013-06-24T12:31:31.697 回答
1

您可以向 MySQL 添加自定义函数。找到了一个看起来可以去掉所有非数字字符的MySQL 去掉非数字字符进行比较

如果您因为返回的结果较大而决定使用限制/偏移量,我强烈建议您这样做,而不是将所有内容都带回 php 并排序。否则,您将不得不将所有内容都拉回 PHP,然后拼接一个数组,此时我认为这将是对资源的低效使用。

或者,如果这是一个可行的选项,您可以在表中添加一个排序列,以允许您更好地利用 MySQL 中的索引,这取决于您的记录集可能会产生巨大的性能差异。

于 2013-06-24T12:46:04.577 回答
0

您可以将用户定义的 preg 函数添加到您的 mysql ( https://github.com/mysqludf/lib_mysqludf_preg )。然后在 order by 子句中使用 PREG_CAPTURE。

于 2013-06-24T12:43:06.843 回答
0

一般来说preg很贵。为了从给定的模式中获得一个数字,我会做这样的事情:

digitstri='1M400'; // just an example
number=intval(is_number(digitstri{2})?substr(digitstri,2):substr(digitstri,3))

我认为,从那里的排序很清楚......

于 2013-08-14T13:44:17.600 回答