Как Mysql ASC заказать 1,2,3,4,5 не 1,10,11,12? - PullRequest
0 голосов
/ 19 октября 2018

Вот мой запрос

$sql=executeQuery("select * from ".PREFIX."frame_info 
                   where Id='".$Id."' $where_clause 
                   order by left(FName, 2), substr(FName, 3) + 0, FName");

PS.Я пробовал следующее, но ничего не получалось

  1. cast (FName as unsigned) ASC
  2. FName + 0
  3. LENGTH (FName), FName

Вот пример данных:

Rayban Slim Fit 5,
Rayban Slim Fit 6,
Rayban Slim Fit 7,
Rayban Slim Fit 3,
Rayban Slim Fit 2,
Rayban Slim Fit 1,
Rayban Slim Fit 9,
Rayban Slim Fit 8,
Rayban Slim Fit 10,
Rayban Princess 149,
Rayban Princess 146,
Rayban Princess 118,
Rayban Princess 147,
Rayban 3141,
Rayban 3143,
Rayban 3153,
Rayban 3152,
Rayban 3130,
Rayban 3128

Ожидаемый результат:

Rayban 3128,
Rayban 3130,
Rayban 3141,
Rayban 3143,
Rayban 3152,
Rayban 3153,
Rayban Princess 118,
Rayban Princess 146,
Rayban Princess 147,
Rayban Princess 149,
Rayban Slim Fit 1,
Rayban Slim Fit 2,
Rayban Slim Fit 3,
Rayban Slim Fit 5,
Rayban Slim Fit 6,
Rayban Slim Fit 7,
Rayban Slim Fit 8,
Rayban Slim Fit 9,
Rayban Slim Fit 10

1 Ответ

0 голосов
/ 19 октября 2018
  • Мы можем использовать функцию Substring_Index () с разделителем в виде одного пробела (' ').-1 позволит нам получить начальную строку от конца FName до первого появления пробела (справа налево).
  • Теперь мы можем использовать CAST(.. AS UNSIGNED) для преобразования подстроки числа в целое число.
  • Используйте Replace() функцию с Trim(), чтобы получить базовое имя (строка без суффикса номера).
  • Теперь,просто Order By сначала базовое имя, а затем номер суффикса («серийный номер»)

Попробуйте следующий запрос ( DB Fiddle DEMO ):

SELECT Cast(Substring_index(fi.fname, ' ', -1) AS UNSIGNED) AS serial_number,
       Trim(REPLACE(fi.fname, Substring_index(fi.fname, ' ', -1), '')) AS
       FName_without_serialno, 
       fi.*
FROM   frame_info AS fi
ORDER  BY fname_without_serialno,
          serial_number
...