MySQL搜索帮助

时间:2011-02-12 06:20:21

标签: php mysql database

我正在使用php / mysql进行搜索。我的表格是'height'和数据类型= varchar(10),其中包含的值类似(5英尺2英寸,5英尺3英寸,......等等)< / strong>即可。在搜索时我得到了2个值 - height1 height2 ,它们基​​本上是范围。如何在该表中搜索范围?比如说 - 我会将范围 5英尺1英寸提供给 5英尺10英寸,并希望获得这些值之间的数据。我正在使用 php 。请帮我解决这个问题。谢谢。

4 个答案:

答案 0 :(得分:2)

我建议您以不同方式存储高度值。如果将其存储为浮点(5.1英尺等)或int(63英寸等),则可以轻松比较这些值。使用mysql解析包含英尺和英寸的字符串会更加困难。

例如:
SELECT * FROM height WHERE rowHeight BETWEEN 12 AND 20

答案 1 :(得分:1)

它使生活变得复杂,但只要是单个数字,就可以在“英寸”部分添加“0”。鉴于你正在存储高度,让我们忽略高度达到10英尺或更高的情况。

示例数据

create table height(height varchar(20) collate utf8_general_ci);
insert height select '5ft 10in';
insert height select '6ft 1in';
insert height select '7ft 10in';
insert height select '8ft 1in';
insert height select '6ft 11in';
insert height select '7ft 2in';

Select声明

select *
from height
cross join (select '5ft 9in' as low, '7ft 3in' as high) inputs
where
  case when height like '%ft _in' then
    concat(left(height, instr(height,'ft')+2), '0', right(height,3)) else height end
between
  case when low like '%ft _in' then
    concat(left(low, instr(low,'ft')+2), '0', right(low,3)) else low end
and
  case when high like '%ft _in' then
    concat(left(high, instr(high,'ft')+2), '0', right(high,3)) else high end

实质上,您将 height1和height2 输入插入此部分

cross join (select '$height1' as low, '$height2' as high) inputs

答案 2 :(得分:0)

由于您使用varchar()来存储高度数据,因此高度值将存储为字符串。因此,要获取某个范围之间的值,必须先对数据进行排序。但是由于你正在使用varchar(),当你按字母顺序对列进行排序时,5英尺10英寸的值在5英尺1英寸之前。

因此,我建议您将脚值和英寸值作为整数存储在2列中,然后根据两列对数据进行排序,将优先级设置为英尺,将较低优先级设置为英寸。

然后在读取结果集时,只需将字符串'ft'和'in'连接到数据中。

答案 3 :(得分:0)

你应该像其他人所说的那样做并将其存储为单个整数值(英寸),所以5英尺10英寸是70英寸。

要再次显示为ft / in,您只需执行以下操作:

$result = 70; //Whatever is retrieved from the DB really, in inches
if($result >= 12) //If result is a foot or more
{
     $feet = floor($result / 12); //Divide the total inches by 12 and round down
     $inches = $result % 12; //Modulus total inches by twelve to get remainder inches
     $string = $feet . 'ft ' . $inches . 'in'; //Combine into string
}
else
{
     $string = $result . 'in'; //Unless you want it to display 0ft 7in or whatever if less than a foot
}

您可以很容易地将DB中的所有值转换为整数,其中包含一个简单的脚本,可以从DB中提取数据,将脚和英寸分开,修剪掉字符串部分(可以通过强制转换完成)一旦它们分开,就转换为int,然后将脚的数字部分乘以12并将其加到英寸的数字部分并更新数据库。

看起来像这样:

$sql = mysql_query("SELECT `id`,`height` FROM `table` WHERE 1");
while($row = mysql_fetch_assoc($sql))
{
     $values = explode(" ",$row['height']); //Split it into two parts at the space between feet and inches
     $feet = (int)$values[0];  //Could also trim off the last 2 characters in the string
     $inches = (int)$values[1];
     $total = ($feet * 12) + $inches; //Of course, given order of operations, the parentheses aren't necessary, but makes it look nicer
     mysql_query("UPDATE `table` SET `height` = $total WHERE `id` = $row['id']");
}

当然,您要做的是在表上创建一个新的空列以保存新的整数值,如heightint或其他内容,然后将旧列重命名为其他内容,然后重命名可能是新列到高度。

好的,如果你没有能力修改表格(对于你的客户来说,你真的应该建议这样一个改进),我认为你需要做的是对某些东西进行查询喜欢:

SELECT * FROM `table` WHERE `height` >= '5ft 10in' AND `height` <= '5ft 1in'

但是就像那个人说的那样,5英尺10英寸将在5英尺1英寸之前出现在那个数据类型中,所以如果它是一个任意的输入,那么它应该是第一个应该是第二个,哪个应该是第二个如果范围超出单脚,那将会捕获所有值。

然后,对它们进行排序的最简单方法可能是将高度转换为如上所述的总英寸,并使用您想要的任何数组排序功能在PHP中对其进行排序。