MySQL/PHP-对非数值字段中的数值进行筛选

MySQL/PHP-对非数值字段中的数值进行筛选,php,mysql,filter,filtering,Php,Mysql,Filter,Filtering,基本上,这个想法是人们根据长度过滤搜索结果。但是,长度存储在文本字段中,因为每个项目的长度可能不同。一个项目可能是16.20米,另一个项目可能是8.1米 一个人怎么开始呢?从数据库中获取所有可能的值,将其更改为筛选的格式(将所有内容解析为仅数字,逗号分隔?),获取关联的ID,然后仅显示与这些ID相关的所有信息,或者是否有我尚未找到的方法 亲切的问候 编辑:标准化格式是一种解决方案,但在这种情况下我无法应用。我不允许这样做。更糟糕的是,过滤可以有一个最小值和一个最大值。最小值:4和最大值:8应显示

基本上,这个想法是人们根据长度过滤搜索结果。但是,长度存储在文本字段中,因为每个项目的长度可能不同。一个项目可能是16.20米,另一个项目可能是8.1米

一个人怎么开始呢?从数据库中获取所有可能的值,将其更改为筛选的格式(将所有内容解析为仅数字,逗号分隔?),获取关联的ID,然后仅显示与这些ID相关的所有信息,或者是否有我尚未找到的方法

亲切的问候


编辑:标准化格式是一种解决方案,但在这种情况下我无法应用。我不允许这样做。更糟糕的是,过滤可以有一个最小值和一个最大值。最小值:4和最大值:8应显示这些长度之间的所有内容。6.1米7.82米5

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

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

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

因为我无法更改数据库的设置方式(标准化是,为长度本身保留单独的字段,一个float/double和一个appendix字段),所以我决定采用这种方法

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

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 ';
}
$minLength=$\u GET['minLength'];
$maxLength=$_GET['maxLength'];
如果(!is_null($minLength)&&!is_null($maxLength)){
$filteredItems='';
foreach($cilength作为$itemId=>$cL){

如果($cL>=$minLength&&$cL我会在您的查询过程中强制执行标准。假设您的长度列名为“length”,而您的查询表名为“table”:

它不会很快,您也可以在其中直接使用replace+0,这样就不需要使用:

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

祝你好运!

你应该规范化数据,这意味着可能会将值和度量单位分为两个字段。我真的应该,我真的希望我可以。但是,这是其他人的项目,很遗憾,我不能也不被允许更改它。你不必更改核心表,但你可以创建一个镜像表正确创建镜像表,并在镜像表上搜索。镜像表可以每小时/天从头开始重新创建(取决于大小和更新频率)或者,如果您的断开的表中有一个
updated_at
列,您可以每10分钟将其保持几乎相同的同步。情况会变得更糟。它必须有一个最小值和一个最大值。其中一个可以为空,两个都可以为空,两个都可以初始化。当然,您必须规范化格式。您需要o编写一个可以实现这一点的函数(根据所有可能的值解析输入并返回标准化(浮点)值)。更好的方法是在将值保存到DB和存储标准化值之前使用此函数(如果还需要原始值,可以向表中添加新列)。您可以使用SQL轻松筛选值。如果无法修改DB,则必须选择所有行并在PHP中进行筛选(使用与以前相同的函数)但这会导致性能问题。正如我在编辑中解释的,以及作为对另一个答案的回答——我希望我能,但我不能。这是不可能的。相信我,这是我跳到的第一件事,但没有人能做到。
SELECT something FROM `table` replace(length,',','.') + 0 BETWEEN 16.2 AND 18