Низкая цена и высокий поиск - PullRequest
0 голосов
/ 16 февраля 2012

Я использую фрагмент кода ниже для поиска ценовых диапазонов. Если я найду 1-600 долларов как низкий-высокий, результаты включают цены, такие как 22 500. Колонна varchar. Спасибо

if (($price_low) && ($price_high)){
$statement .= " OR item_price BETWEEN ? AND ? ";
push(@binds,$price_low,$price_high);
}
elsif (($price_low) && ($price_high eq "")){
$statement .= " OR item_price > ? ";
push(@binds,$price_low);
}
elsif (($price_high) && ($price_low eq "")){
$statement .= " OR item_price BETWEEN ? AND ? ";
push(@binds,1,$price_high);
}
else {  }
my $sth = $dbh->prepare(qq(SELECT * FROM ads WHERE $statement )) or  die $DBI::errstr;
$sth->execute(@binds);

1 Ответ

3 голосов
/ 16 февраля 2012

Вы пишете:

Колонна варчар.

В этом и заключается ваше форматирование в столбце. Для строки, которую вы упоминаете, вы, по сути, делаете это:

> SELECT '22,500' BETWEEN 1 AND 600;

MySQL принудительно преобразует строку '22,500' в числовое значение, отсекая все после (и включая) первую запятую. Таким образом, item_price из '22,500' становится 22, что, конечно, между 1 и 600. (Что произойдет, если вы ПОКАЖИТЕ ПРЕДУПРЕЖДЕНИЯ после выполнения вашего оператора? Я думаю, вы увидите предупреждение о неправильном усечении DOUBLE ... )

Преобразуйте ваш столбец в истинный числовой тип и повторите запрос. (Исправление проблемы @CanSpice указал ...)

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