比较值是否在数字mysql的范围内

时间:2015-09-02 02:35:02

标签: php mysql max min

在我的数据库中,我有两列,即: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']);
    }
}

如果MinMax的值始终为数字,则可以。但有一个实例,Max的值为above。如何比较这种情况?

示例值为

enter image description here

或者我应该更改Max值。任何建议表示赞赏

2 个答案:

答案 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)

  

我有2列,分别是:Min和Max,它们是varchar

这是错的。它应该是int或至少十进制值

  

我的查询是这样的

这是错的。您的查询应包含$ marketval来执行数据库端的所有计算。

  

这是Max的值高于的实例。

这是错的。没有数字列应该包含字符串。你可以存储一个大号码。或者是NULL,但不是字符串。