ПОРЯДОК ПО цене со знаком $ и запятыми

#php #mysql

#php #mysql

Вопрос:

В моей базе данных есть поле с именем «price», и оно настроено как varchar. Он содержит знак доллара, а также запятые.

Значения в моей базе данных выглядят следующим образом:

$100,000
$625,005
$115,990
$2,450,000
$137,005

и я бы хотел, чтобы он упорядочивал это следующим образом:

$100,000
$115,990
$137,005
$625,005
$2,450,000

Я пробовал ПОРЯДОК По цене 0 и ПОРЯДОК По ABS (price), но они просто выводились в том порядке, в котором они были в базе данных. Есть ли способ заказать это, сохранив поле varchar

Комментарии:

1. Никогда не храните такого рода информацию в одном поле. Либо вы указываете валюту в поле и используете ее в своем коде для отображения знака доллара, либо у вас его вообще нет.

2. БОЖЕ! Хотя существуют семантические аргументы об использовании чисел с плавающей запятой вместо целых значений, где нет явного типа валюты, использование поля varchar просто глупо!

Ответ №1:

Если это вообще возможно, измените свою базу данных, чтобы хранить эти значения в поле int , float или decimal , в зависимости от того, какая точность вам нужна. Добавьте $ и все другое форматирование при выводе значений.

Все остальное просто привязано к плохой структуре базы данных. Это не невозможно, но это должно быть самым последним средством, когда нет абсолютно никакого способа изменить базу данных.

Комментарии:

1. Предложение здесь обоснованное, однако оно не дает ответа на задаваемый вопрос «Можно ли как-нибудь заказать это, сохранив поле varchar»

Ответ №2:

Полностью соглашаясь с приведенными выше сообщениями относительно дизайна базы данных, в любом случае есть плохой способ:

 SELECT REPLACE(REPLACE(price,',',''),'$','') as cleanPrice FROM Table ORDER BY cleanPrice
  

Запрос должен выполнять замены в каждой отдельной строке и, следовательно, может стать очень медленным..

Ответ №3:

Честно говоря, вам действительно следует хранить их как int и форматировать их в PHP, когда вы извлекаете их из базы данных, таким образом, с данными легче работать, и вы можете манипулировать ими как INT.

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

Если вы храните несколько типов цен, вы также можете сохранить тип валюты в базе данных; в данном случае это будет USD.

Комментарии:

1. Предложение здесь разумное, однако оно не дает ответа на задаваемый вопрос «Можно ли вообще заказать это, сохраняя поле varchar»

Ответ №4:

Я быстро сделал это в Oracle, поэтому это может не сработать в MySQL … если нет, прошу прощения. Я только выбираю цены

 select price
from table
order by (cast(substr(replace( replace('price', ',', ''), '"', '' ), 2, length(replace( replace('price', ',', ''), '"', '' ))-1) as int)
  

Комментарии:

1. Но да, уродство этого запроса заключается в том, что вы должны сохранять числа как тип данных number и просто использовать функцию форматирования, чтобы отобразить его как money, если потребуется.

Ответ №5:

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

К сожалению, mysql не поддерживает вычисляемые столбцы, поэтому после создания нового столбца вам нужно будет добавить триггеры (при обновлениях и вставках) для вычисления значения для каждой вставленной / измененной строки в таблице.

В вашем триггере вы бы использовали REPLACE(ЗАМЕНИТЬ(цена,’$’,»),’,’,») для значения нового столбца.

Вы также могли бы создать представление, в котором есть эта логика, и выбрать из нее.

Документация mysql для создания триггеров находится здесь

Документация mysql по использованию представлений находится здесь

Комментарии:

1. 1 для наилучшего решения. Было бы неплохо иметь несколько ссылок о том, как начать создавать триггер.

2. @Pekka, спасибо за предложение, я обновил свой ответ ссылками на документацию