Mysql Сортировать цену, когда цена тыс. К К, млн. К М - PullRequest
0 голосов
/ 20 ноября 2018

В базе данных MySQL цены хранятся таким образом:

98.06K
97.44K
929.14K
91.87K
2.66M
146.64K
14.29K

, когда я пытаюсь отсортировать цену ASC или Price DESC, он возвращает неожиданный результат.

Пожалуйста, предложитемне, как я могу отсортировать цену, когда цена в 10K, 20M, 1.6B

Я хочу результат

14.29K
91.87K
97.44K
98.06K
146.64K
929.14K
2.66M

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Проблема заключается в вашей модели данных.Я понимаю, что 2.66M - это не обязательно 2660.000, поэтому вы не хотите хранить целое число, а вместо этого сохраните 2.66M, чтобы указать точность.Это, однако, две части информации: значение и точность, поэтому используйте два столбца:

mytable

value  | unit
-------+-----
 98.06 | K
 97.44 | K
929.14 | K
 91.87 | K
  2.66 | M
146.64 | K
 14.29 | K

Вместе с таблицей поиска:

units

unit | factor
-----+--------
K    |    1000
M    | 1000000

Возможный запрос будет:

select *
from mytable
join units using (unit)
order by mytable.value * units.factor;

, где вы можете захотеть расширить предложение ORDER BY на что-то вроде

order by mytable.value * units.factor, units.factor;

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

0 голосов
/ 20 ноября 2018

Возможно, хотя и не желательно:

https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=0a837287c7646823fa6657706f9ae634

  SELECT *
       , CAST(LEFT(price, LENGTH(price) - 1) AS DECIMAL(10,2)) AS value
       , RIGHT(price, 1) AS unit
       , CASE RIGHT(price,1)
         WHEN 'K' THEN 1000
         WHEN 'M' THEN 1000000
         ELSE 1
          END AS amount
    FROM test1
ORDER BY amount, value;

Почему не рекомендуется?Как показывает объяснение в dbfiddle, этот запрос использует сортировку файлов для сортировки, которая не очень быстра.Если у вас не слишком много строк в ваших данных, это не должно быть проблемой.

0 голосов
/ 20 ноября 2018

MySQL игнорирует завершающие не-цифры при приведении строки к числовому.Это вернет правильную цену:

price * 
case right(price,1)
  when 'K' then 1000
  when 'M' then 1000000
  else 1
end

Конечно, вы можете заказать по ней, но лучше применить ее во время загрузки и сохранить цену в числовом столбце .

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