在我的数据库中,我有两列,即: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
值。任何建议表示赞赏
答案 0 :(得分:3)
假设最大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 除了将主要数字数据存储为字符串之外,还有更好的方法可以做到这一点,因为您希望能够存储值{{1 }}
下面的两种方法都涉及将列类型转换为数字类型,这样可以更好地进行比较,包括让DBMS自己解决问题,而不是必须获取所有数据并使用PHP对其进行后处理。数据操作是DBMS最擅长的,因此通常最好将操作留给DBMS以提高效率。
第一种方法是在“上方”行的最大值中加上一个可笑的大数字,这样你的简单“在最小和最大之间”检查就可以了。使用DBMS本身来获得定价水平将很简单:
'above'
这将为您提供包含正确定价级别的单行。
第二种是在该列中存储NULL而不是字符串。可以为空的数字列仍然可以稍作修改:
select pricing_level
from pricing_tbl
where product_id = '10'
and $market_val >= minval
and $market_val < maxval
在这两种情况下,您可能希望在呈现或编辑表本身时将上部区域(大号或空)转换为单词select pricing_level
from pricing_tbl
where product_id = '10'
and $market_val >= minval
and ($market_val < maxval or maxval is null)
和从单词above
转换。即使基础数据发生了变化,这也会使过程看起来一样。
答案 1 :(得分:0)
这是错的。它应该是int或至少十进制值我有2列,分别是:Min和Max,它们是varchar
这是错的。您的查询应包含$ marketval来执行数据库端的所有计算。我的查询是这样的
这是错的。没有数字列应该包含字符串。你可以存储一个大号码。或者是NULL,但不是字符串。这是Max的值高于的实例。