基于 WHERE 的带有额外手动输出的 MySQL 查询

Posted

技术标签:

【中文标题】基于 WHERE 的带有额外手动输出的 MySQL 查询【英文标题】:MySQL query with extra manual output based on WHERE 【发布时间】:2012-11-13 13:32:28 【问题描述】:

也许这是一个愚蠢的问题,但想象一下有一个包含以下字段的表格:

wholename, lastname, firstname, dateOfBirth

现在我想根据用户输入搜索该表,但我想为结果提供匹配百分比。含义:

如果 lastname + firstname + dateOfBirth 都在数据库中找到 matchPrct = 100。 如果在数据库中找到 lastname + dataofBirth,则 matchPrct = 80。 还有一些其他规则(换句话说,字段 matchPrct 是一个自动生成的字段,它实际上并不在数据库中)。

我想要实现的SQL是:

SELECT * FROM table 
WHERE firstname="%mike%" AND lastname="%tysson%" AND dateOfBirth="01/01/2012"
(create matchPrct=100) OR ....

希望我的意思很清楚。

【问题讨论】:

你能解释一下你想实现的所有规则吗?让我重新表述一下这个问题以供我理解...如果在表中找到所有用户输入值,则 matchPrct = 100,如果找到 2 个值,则它的 80 仅找到值,然后其他百分比值是什么是必需的吗? 我建议使用来自full text search criteria的score 我有一个包含详细信息的名称列表(例如上面的字段),然后用户将在表单中输入一些信息。结果基于用户输入的内容。问题是,这最终不是一个单一的结果。我想要实现的是不仅要找到最佳匹配,还要找到可能是他们正在寻找的人的匹配。换句话说,用户可能输入了错误的姓名详细信息,但出生日期是正确的。我知道很有可能,但由于法律规定,我也必须展示这些,并让用户选择是否是那个人 所以找到的任何字段都是一个点,匹配的字段越多,点就越多。 (因为他们正在寻找的人越有可能)另外,我需要非常快的查询时间,因为用户可能一次搜索很多名字。 【参考方案1】:

LIKE 是一个返回布尔值的运算符,= 的行为类似。 mysql 中的布尔值是 1 表示真,0 表示假。这意味着你可以这样说:

select *,
      ((firstname like '%mike%') + (lastname like '%tysson%') + (dateOfBirth = '01/01/2012')) / 3.0 as score
from table
where firstname like '%mike%'
   or lastname like '%tysson%'
   or dateOfBirth = '01/01/2012'

然后从score 中读取您的“匹配程度”值。您还可以对每个组件应用单独的权重,以便姓氏匹配比名字匹配更重要。

在不使用 1 和 0 作为布尔值的数据库中,您可以强制转换它们或使用 CASE 将布尔值转换为您想要的数字。这当然不适用于 MySQL,但值得牢记。

【讨论】:

感谢您的快速回复。从来没有想过把它放在选择中。这种表现如何明智?有什么想法吗? @reevdkooi:你得问问数据库,它可能足够聪明,可以识别重复的组件,但它可能不会。

以上是关于基于 WHERE 的带有额外手动输出的 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL SELECT:如何获取一个额外的列,指示是不是满足 WHERE 子句中的第一个或第二个条件?

MySQL 加入 + “WHERE something=MAX(something)”

带有 WHERE 子句的 MySql 内部连接 ​​[关闭]

MySQL 错误代码:在带有 WHERE 子句的 UPDATE 期间出现 1175

MySQL 不使用带有 WHERE IN 子句的索引?

MySQL 不使用带有 JOIN、WHERE 和 ORDER 的索引