Php 如何找到最接近的结果?

Php 如何找到最接近的结果?,php,mysql,sql,select,Php,Mysql,Sql,Select,假设我有一个包含字段A、B、C、D、E、F的数组,其值可以是A随机数 我使用这些字段进行查询,其中a='random number'和B='random number'。。。F=‘随机数’ 如果结果为空,那么我将从数组中删除最后一个字段,然后运行query,其中A='random number'和B='random number'。。。E=‘随机数’ 这个过程重复,直到我得到结果。 现在,我发现了一个新的情况,如果我只删除D字段并运行查询,它将返回结果 我不知道如何处理这种情况。一个选项是计算行

假设我有一个包含字段A、B、C、D、E、F的数组,其值可以是A
随机数

我使用这些字段进行查询
,其中a='random number'和B='random number'。。。F=‘随机数’

如果结果为空,那么我将从数组中删除最后一个字段,然后运行query
,其中A='random number'和B='random number'。。。E=‘随机数’

这个过程重复,直到我得到结果。 现在,我发现了一个新的情况,如果我只删除
D
字段并运行查询,它将返回结果


我不知道如何处理这种情况。

一个选项是计算行中有多少列与该数字相等,然后取匹配最多的行。MySQL能够在数字上下文中将布尔值处理为0和1,因此这可以相对容易地完成(但请注意运算符优先级和所需的括号):

选择*
从mytable
排序依据(a=随机数)+
(b=随机数)+
(c=随机数)+
(d=随机数)+
(e=随机数)描述
限制1

一个选项是计算行中有多少列与该数字相等,并获取匹配最多的行。MySQL能够在数字上下文中将布尔值处理为0和1,因此这可以相对容易地完成(但请注意运算符优先级和所需的括号):

选择*
从mytable
排序依据(a=随机数)+
(b=随机数)+
(c=随机数)+
(d=随机数)+
(e=随机数)描述
限制1

如果确实要在每个步骤中删除最后一列,则:

select t.*
from t
order by (a, b, c, d, e) = ($a, $b, $c, $d, $e) desc,
         (a, b, c, d) = ($a, $b, $c, $d) desc,
         (a, b, c) = ($a, $b, $c) desc,
         (a, b) = ($a, $b) desc,
         a = $a desc
limit 1;
注意:如果没有匹配项,则仍将返回一行。这似乎符合你的模式

您还可以使用:

select t.*
from t
order by (a = $a) desc,
         (b = $b) desc,
         (c = $c) desc,
         (d = $d) desc
         (e = $e) desc
limit 1;

如果确实要在每个步骤中删除最后一列,则:

select t.*
from t
order by (a, b, c, d, e) = ($a, $b, $c, $d, $e) desc,
         (a, b, c, d) = ($a, $b, $c, $d) desc,
         (a, b, c) = ($a, $b, $c) desc,
         (a, b) = ($a, $b) desc,
         a = $a desc
limit 1;
注意:如果没有匹配项,则仍将返回一行。这似乎符合你的模式

您还可以使用:

select t.*
from t
order by (a = $a) desc,
         (b = $b) desc,
         (c = $c) desc,
         (d = $d) desc
         (e = $e) desc
limit 1;

显示一些您尝试过的PHP查询代码。现在这个“新案例”有什么特别之处?使用删除最后一个条件的方法,您在某个时候也会删除
D
,这样只有对A、B和C的检查保持不变。现在这还不足以找到你想要的记录吗?需要正确的解释。它可能会归结为从WHERE子句中删除所有这些条件,选择实际列内容和每个列的随机值之间的差异(可能是绝对值),然后以某种方式排序,选择顶部记录…示例中的“随机数”在所有字段中的值是否相同?显示一些您尝试过的PHP查询代码。现在这个“新案例”有什么特别之处?使用删除最后一个条件的方法,您在某个时候也会删除
D
,这样只有对A、B和C的检查保持不变。现在这还不足以找到你想要的记录吗?需要正确的解释。它可能会归结为从WHERE子句中删除所有这些条件,选择实际列内容和每个列的随机值之间的差异(可能是绝对值),然后以某种方式排序,选择最上面的记录…在您的示例中,所有字段的“随机数”值是否相同?@nas。这是一个非常合理的操作,但它没有具体解决您提出的问题。这将统计匹配数,返回匹配数最多的行。但是,它不会一次删除一列。谢谢Gordon,因为现在我正在考虑其他解决方案。首先让我完成我的方法,然后我将寻找您的解决方案。@nas。这是一个非常合理的操作,但它没有具体解决您提出的问题。这将统计匹配数,返回匹配数最多的行。但是,它不会一次删除一列。谢谢Gordon,因为现在我正在考虑其他解决方案。首先让我完成我的方法,然后我将寻找您的解决方案。