В моей базе данных у меня есть 2 столбца, а именно: Min and Max
они varchar, и у них есть числовые значения, с которыми мне нужно сравнить. Мой запрос что-то вроде этого
SELECT * FROM Pricing_tbl WHERE Productid='10'
и у меня есть это, чтобы сравнить цену
while ($selected_row = $stmt - > fetch(PDO::FETCH_ASSOC)) {
if ($marketval > $selected_row['Min'] && $marketval < $selected_row['Max']) {
$price[] = array('price_level' => $selected_row['price_level']);
}
}
Это нормально, если значения Min
а также Max
всегда цифры. Но есть случай, когда значение Max
является above
, Как сравнить эту ситуацию?
Пример значений будет
Или я должен просто изменить Max
значение. Любое предложение приветствуется
Предполагая максимум above
означает весь путь до бесконечности, и вы хотите сохранить данные как есть 1, Вы можете просто изменить условие:
$marketval > $selected_row['Min'] && $marketval < $selected_row['Max']
в нечто вроде:
$marketval >= $selected_row['Min'] &&
($selected_row['Max'] == 'above' || $marketval < $selected_row['Max'])
Другими словами, значение считается максимальным всегда если максимум слово above
, В противном случае решает фактическое (оригинальное) сравнение.
Короткое замыкание PHP на логических операторах обеспечит, что вторая половина or
раздел никогда не будет оцениваться, если первая половина верна.
Обратите внимание на изменение, которое я внес в минимальное сравнение, использование >=
скорее, чем >
, Как это было, значение как 300000.01
не был бы пойман.
Вы может также хочу привести цифры в сравнении с $marketValue
, Если оба $marketValue
а также $selectedRow['whatever']
Струны, я считать они все равно будут использовать числовое сравнение, но я обычно стараюсь быть явным, поэтому мне не нужно об этом думать 🙂
1 Есть, вероятно, лучшие способы сделать это, кроме хранения того, что в основном числовые данные в виде строк только потому, что вы хотите иметь возможность хранить значение 'above'
,
Оба метода ниже включают преобразование типа столбца в числовой, что позволит лучше сравнивать, в том числе наличие самой СУБД, а не получение всех данных и последующая обработка с помощью PHP. Манипулирование данными — это то, что СУБД делает лучше всего, поэтому обычно лучше оставить эту манипуляцию СУБД для эффективности.
Во-первых, нужно поставить смехотворно большое число в максимуме для строки «выше», чтобы сработала простая проверка «между минимальным и максимальным». Использовать саму СУБД для получения ценового уровня было бы просто:
select pricing_level
from pricing_tbl
where product_id = '10'
and $market_val >= minval
and $market_val < maxval
Это даст вам одну строку, содержащую правильный уровень цен.
Второе — хранить NULL в этом столбце вместо строки. Обнуляемый числовой столбец все еще будет работать с небольшой модификацией:
select pricing_level
from pricing_tbl
where product_id = '10'
and $market_val >= minval
and ($market_val < maxval or maxval is null)
В обоих случаях вы можете перевести верхнюю область (большое число или ноль) в и из слова. above
при представлении или редактировании самой таблицы. Это заставит процесс выглядеть одинаково, даже если базовые данные изменились.
у меня есть 2 столбца, а именно: Мин и Макс они VARCHAR
это не верно. Должно быть int или хотя бы десятичные значения
Мой запрос что-то вроде этого
это не верно. Ваш запрос должен включать $ marketval, чтобы выполнить все вычисления на стороне базы данных.
Вот пример, где значение Max выше.
это не верно. Ни один числовой столбец не должен содержать строку. Вы можете хранить большое количество там. или NULL, но не строка.