2013-04-19 2 views
3

Мне был дан проект электронной коммерции, чтобы исправить некоторые ошибки моим клиентом. Раньше dumb разработчики дали поле цены VARCHAR datatype вместо столь очень очевидного INTEGER в таблице продуктов, и поэтому следующий набор разработчиков, чтобы поиск по диапазону цен работал, использовался CAST(PRICE AS DECIMAL). Теперь я третий, чтобы работать над этим, и обнаружил, что эта вещь CAST AS DECIMAL не странно работает только для ценового диапазона 0-500, но работает для всех остальных, таких как 500-1000, 1000-2000 и так далее. на.MYSQL CAST AS DECIMAL для поля VARCHAR

Запрос, как:

Запрос до сих пор:

SELECT * FROM tbl_product where status=1 and subcat_id='128' and 
price>'0' and price<='500' ORDER BY CAST(price AS DECIMAL(12,2)) ASC 

Это как-то ищут продукты с ценой 1000 и вверх .. Пожалуйста, помогите ..

ответ

2

лучший вариант здесь - принять, что VARCHAR не является правильным типом данных. Ваш план действий прост.

  1. Добавить новый столбец priceNew DECIMAL (12,2)
  2. перенесите данные цены в priceNew
  3. После того, как вы подтвердили данные верны в priceNew, удалять и переименовывать цену priceNew к цене
  4. Remove все CAST (цена AS DECIMAL) hackjobs и начать дело с числом как число
  5. Update ничего, что SELECT/UPDATE/INSERT, чтобы цена, чтобы убедиться, что он имеет дело с правильным новым типом данных

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

+0

Я имел это в виду как ПЛАН Б. На самом деле, есть много других полей, которые должны были быть типа INTEGER, но ранним разработчикам был дан VARCHAR. Итак, я думал создать другую зеркальную таблицу с правильными типами данных, написать PHP-скрипт для чтения данных из неправильной таблицы и вставить в правильный. Считаете ли вы, что это правильный подход? Таким образом, мне даже не придется добавлять новые столбцы в DECIMAL (12,2) – coder101

+0

Это нужно сделать, это действительно так. Это нужно сделать один раз, получить правильные типы данных. Нумерация вообще должна быть INT (или TINYINT/SMALLINT/MEDIUMINT). Валюта обычно должна быть DECIMAL (x, 2), где x = часто около 10-12. НИКОГДА НИКОГДА НИКОГДА не добавляйте валюту в FLOAT(), если вы цените точность, поскольку в конце концов вы начнете проигрывать пенни. В вашем выборе ключевой проблемы вы ожидаете, что строка (цена) будет вести себя как числовая, и ее просто нет. Вы можете «WHERE CAST (цена AS DECIMAL) <= 500' и ​​т. Д. Но это приведет к сканированию таблиц по каждому запросу. Лучше просто исправить это как можно скорее. –

+1

спасибо, simon, я думаю, мне нужно это сделать. Я лучше поручу своему клиенту за это :) – coder101

Смежные вопросы