2013-07-13 4 views
0

У меня есть таблица MySQL с структуры цен что-то вроде этого:MySQL BETWEEN возвратит 0 строк

-------------------- 
| Price | item_id | 
-------------------- 
|$10,999| 123  | 
|$5,889 | 321  | 
|$2999 | 143  | 
|------------------| 

Теперь, если я запрашиваю это:

SELECT * FROM products WHERE price BETWEEN "$2999" AND "$6000"; 

Она возвращает две строки. Но если я запрашиваю это:

SELECT * FROM products WHERE price BETWEEN "$2999" AND "$20000"; 

Он не будет возвращать строку, как ожидается, вернуть по крайней мере 3 строки?

Пожалуйста, обратите внимание, что есть много других строк, которые как хорошо $ 11 000, и так далее ...

Любая помощь будет оценен по достоинству!

ответ

4

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

Но, чтобы ответить на ваш вопрос напрямую, вы можете это сделать, но не используете какой-либо индекс, если вы его определяете.

WHERE CAST(REPLACE(REPLACE(price,'$',''),',','') AS SIGNED) 
     BETWEEN 2999 AND 20000 
+0

это работало отлично! проголосовали, но можете ли вы объяснить, влияет ли это на производительность страницы? – Ahsan

+0

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

+0

Спасибо, соответственно, получил лучшее! – Ahsan

1

Я полагаю, что цена - это текстовое поле, а не числовое. Итак, когда вы пытаетесь получить строки между $ 2999 и $ 20000, ничего не возвращается, потому что на самом деле 20000 меньше 2999 при сравнении с строками.

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

+0

Вы имеете в виду сравнение 20000 и 2999, 20000 меньше? как 20000 <2999? – Ahsan

+0

Да, когда вы сравниваете их как строки. –

2

Казалось бы, вы храните цену как строку, а не цифру. Между «$ 2999» и «$ 20000» нет ничего, потому что «$ 2999»> «$ 20000» в алфавитном порядке.

Вот один из способов исправить это:

SELECT 
FROM products 
WHERE cast(replace(replace(price, '$', ''), ',') as signed) BETWEEN 2999 AND 20000; 

Лучше всего было бы сохранить «цену» в виде числа, а не характер.

+0

в 'mysql', вы должны использовать' SIGNED' или 'UNSIGNED', иначе он выдает ошибку. –

+0

@ 491243. , , Спасибо. Я знаю это.Я просто забываю об этом каждый раз, когда я хочу целое поле в MySQL. –

1

Оставьте цифры $ и оставьте только цифры. Вам не нужно сохранять знак доллара с числами в БД.

SELECT * FROM products WHERE price > 2999 AND price < 6000;
SELECT * FROM products WHERE price > 2999 AND price < 20000;

или

SELECT * FROM products WHERE price BETWEEN 2999 AND 6000";
SELECT * FROM products WHERE price BETWEEN 2999 AND 20000";

+0

это все равно вернет 0 строк? Но я использовал CAST (замените (замените ..)); и это сработало, но производительность и реакция были действительно медленными. – Ahsan

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