Как правильно составить SQL запрос с использованием команды BETWEEN и реализовать его с помощью PDO PHP подготовленными запросам
Питаюсь реализовать фильтр товаров по цене, имеются две переменные которые я использую как минимум и максимум того промежутка цен который нужно извлечь с БД, ниже представляю пример того чего я навоял
$db_act = $connect_db->prepare("SELECT * FROM `table_product` WHERE `price` BETWEEN ? AND ?");
$db_act->execute(array($this -> from, $this -> up));
$array_product = $db_act->fetchAll(PDO::FETCH_ASSOC);
Проблема заключается в том что, запрос работает как то не полностью, если установить минимум 100 рублей, а максимум 100000 рублей, то вернуться соответствующие результаты, однако работает это с определёнными промежутками, например если я изменю минимум и поставлю 30 рублей место 100 то результата не будет вообще никакого, казалось бы, промежуток стал больше, но запрос возвращает 0 строк, я даже не могу понять какого рода это ошибка
Мой вопрос: как правильно реализовать такой SQL запрос, должен быть именно подготовленный запрос
Опишу свою БД, MySQL, в таблице 41 кортеж (знаю это не правильно, ну мне и не нужно правильно, нужно чтобы работало), поле price -> vchar(10), в этом поле только цифры без пробелов и других способов форматирования
Ответы (1 шт):
поле price -> vchar(10)
Ну, само собой разумеется, СУБД и использует операторы сравнения строк. Строка "30" больше строки "100" потому что символ "3" больше символа "1", а остальные символы строки значения уже не имеют, ведь на вопрос '30' >= '100' ответ уже получен после сравнения первого символа.
Исторически символ "3" больше символа "1" потому, что в таблице кодировки ASCII (да и наверное, всех кодировок) обозначение символа 1 предшествует символу 3. Сейчас нагромождения collation весьма ситуацию запутывает, но базовый вопрос сравнения чисел не менялся.
Короче, хватит исторических отступлений: храните числа как числа. Это типы данных int, bigint, numeric в SQL. Ещё float или double в тех задачах, где уместны приблизительные вычисления (ни в коем случае не для денег)