Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL产品名称的自然排序_Mysql - Fatal编程技术网

MySQL产品名称的自然排序

MySQL产品名称的自然排序,mysql,Mysql,我有一个标题栏中有以下内容的表格 a short name z short name Oase AquaMax ECO Premium 10000 Pump Oase AquaMax ECO Premium 12000 Pump Oase AquaMax ECO Premium 16000 Pump Oase AquaMax ECO Premium 4000 Pump Oase AquaMax ECO Premium 6000 Pump Oase AquaMax ECO Premium 8000

我有一个标题栏中有以下内容的表格

a short name
z short name
Oase AquaMax ECO Premium 10000 Pump
Oase AquaMax ECO Premium 12000 Pump
Oase AquaMax ECO Premium 16000 Pump
Oase AquaMax ECO Premium 4000 Pump
Oase AquaMax ECO Premium 6000 Pump
Oase AquaMax ECO Premium 8000 Pump
我需要订购这些,正如您希望看到的,如下所示

a short name
Oase AquaMax ECO Premium 4000 Pump
Oase AquaMax ECO Premium 6000 Pump
Oase AquaMax ECO Premium 8000 Pump
Oase AquaMax ECO Premium 10000 Pump
Oase AquaMax ECO Premium 12000 Pump
Oase AquaMax ECO Premium 16000 Pump
z short name
但当我这样做的时候:

select `title` from `products` order by `title` ASC
它们按此顺序出现

a short name
Oase AquaMax ECO Premium 10000 Pump
Oase AquaMax ECO Premium 12000 Pump
Oase AquaMax ECO Premium 16000 Pump
Oase AquaMax ECO Premium 4000 Pump
Oase AquaMax ECO Premium 6000 Pump
Oase AquaMax ECO Premium 8000 Pump
z short name
我也尝试过:

select `title` from `products` order by `title` + 0 ASC
但同样的道理,如何克服这一问题,使它们以正确的顺序出现呢?

试试看

select title from products order by length(title),title ASC

不要在表名和字段名周围使用单引号

您可以使用此查询将标题列转换为ASC顺序:

SELECT title
FROM temp
ORDER BY CONVERT( SUBSTRING( title, 26, 9 ) , UNSIGNEDINTEGER ) 

因此,主要问题是字符串中有一个整数,并且希望在查询中将其用作辅助排序

这里的问题是,MySQL不只是支持您从字符串中提取该数字,在这里,一个regexp会很好,正如下面讨论的那样。另一种解决方案可能是,尝试用locate查找第一个数字的位置,如图所示

如果标题中最多有一个数字,则以下查询有效:

SELECT s FROM
  -- this subselect returns positions for the first number in the title
  (SELECT *, LEAST( 
    if (LOCATE('0',title)>0,LOCATE('0',title),999),
    if (LOCATE('1',title)>0,LOCATE('1',title),999),
    if (LOCATE('2',title)>0,LOCATE('2',title),999),
    if (LOCATE('3',title)>0,LOCATE('3',title),999),
    if (LOCATE('4',title)>0,LOCATE('4',title),999),
    if (LOCATE('5',title)>0,LOCATE('5',title),999),
    if (LOCATE('6',title)>0,LOCATE('6',title),999),
    if (LOCATE('7',title)>0,LOCATE('7',title),999),
    if (LOCATE('8',title)>0,LOCATE('8',title),999),
    if (LOCATE('9',title)>0,LOCATE('9',title),999)
  ) AS firstint_pos FROM products) AS t
ORDER BY
  -- first order by the string before the integer value
  IF (firstint_pos<999, SUBSTR(title,1, firstint_pos), s),
  -- then order by the integer value
  CONVERT(SUBSTR(title, firstint_pos), SIGNED);

或者您可以在表中添加一种sortno列并对其进行维护…

这项工作很好,直到我添加更多标题较短的产品为止。我会稍微修正一下我的问题,如果字符串总是一样长就可以了。你是说字符串是不固定的?