MySQL / PHP - 过滤非数字字段的数值

时间:2014-01-06 09:08:11

标签: php mysql filter filtering

基本上,人们的想法是人们根据长度过滤搜索结果。但是,长度存储在文本字段中,因为这可能因项目而异。一件物品可能是16,20米,另一件可能是8.1米。

怎么会开始?从数据库中获取所有可能的值,将它们更改为过滤的格式(将所有内容解析为仅数字,逗号分隔?),获取关联的ID,然后仅显示与这些ID相关的所有信息,或者是否存在我还没找到的方法呢?

亲切的问候。

编辑:标准化格式是一种解决方案,但在这种情况下我不能应用。我不被允许这样做。情况变得更糟 - 过滤可以同时具有最小值和最大值。最小值:4和最大值:8应显示这些长度之间的所有内容。 6.1米,7,82米,5。

3 个答案:

答案 0 :(得分:1)

因为我无法改变数据库的设置方式(标准化是,为长度本身保留单独的字段,浮点数/双精度数和附录的字段),我决定采用这种方法

首先获得所有可能的长度,然后:

foreach($lengths as $length) {
 $cLengths[$length['item_id']] = preg_replace("/[^0-9,.]/", "", str_replace(',', '.', $length['field_value']));
}

假设在URL中使用& minLength = 2& maxLength = 10调用该页面:

$minLength = $_GET['minLength'];
$maxLength = $_GET['maxLength'];
if(!is_null($minLength) && !is_null($maxLength)) {
 $filteredItems = '';
 foreach($cLengths as $itemId => $cL) {
  if($cL >= $minLength && $cL <= $maxLength) {
   $filteredItems .= $itemId . ',';
  }
 }
 $filteredItems = substr($filteredItems, 0, -1);
 $where .= 'item_id IN(' . $filteredItems . ') AND ';
}

答案 1 :(得分:0)

我建议标准化长度格式。很难过滤以不同格式存储的数值。

您可以使用LIKE运算符搜索字符串中的任何模式:

SELECT * FROM table WHERE length LIKE '%filtervalue%'

答案 2 :(得分:0)

我会在查询期间执行标准。假设您的长度列名为“length”,并且您查询表是“table”:

SELECT something, replace(length,',','.') + 0 as mylen FROM `table` HAVING mylen BETWEEN 16.2 AND 18

它不会很快,你也可以直接在其中使用替换+ 0,它会消除HAVING的需要:

SELECT something FROM `table` replace(length,',','.') + 0 BETWEEN 16.2 AND 18

祝你好运!