#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, спасибо за предложение, я обновил свой ответ ссылками на документацию