基本上,人们的想法是人们根据长度过滤搜索结果。但是,长度存储在文本字段中,因为这可能因项目而异。一件物品可能是16,20米,另一件可能是8.1米。
怎么会开始?从数据库中获取所有可能的值,将它们更改为过滤的格式(将所有内容解析为仅数字,逗号分隔?),获取关联的ID,然后仅显示与这些ID相关的所有信息,或者是否存在我还没找到的方法呢?
亲切的问候。
编辑:标准化格式是一种解决方案,但在这种情况下我不能应用。我不被允许这样做。情况变得更糟 - 过滤可以同时具有最小值和最大值。最小值:4和最大值:8应显示这些长度之间的所有内容。 6.1米,7,82米,5。
答案 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
祝你好运!