【问题标题】:LIKE statement not finding all in queryLIKE 语句未在查询中找到所有内容
【发布时间】:2013-02-11 15:37:51
【问题描述】:

我有一个类似这样的声明:

AND ( CONCAT( arc_property_res.STREET_NUM, ' ', arc_property_res.STREET_NAME ) LIKE '%{$address}%'

NUMNAME 位于不同的列中。目前,如果我有一个输入字段并输入,则此查询有效:000 Street Dr 但是一旦我尝试这样做:000 Street Drive 我得到 0 个结果。 Rd、Blvd、Pk 和其他一些地方也会发生同样的情况。

我尝试只使用一个通配符%,但仍然没有找到任何东西。感谢您提供任何帮助或想法。


更新

我将表格转换为使用 MyISAM,以便可以使用全文搜索。所以现在所有匹配的查询都有效,即:Dr、Drive、Rd、Road 等......

我的查询现在看起来像这样:

AND ( MATCH(arc_property_res.STREET_NUM, arc_property_res.STREET_NAME) AGAINST('{$address}')

在某些情况下,我输入的地址不会先出现。请注意正确的列表在那里,它不是第一个。

例子:

有什么想法吗?

【问题讨论】:

  • 你能发布一些示例数据吗?你期望结果是什么
  • 嗯,这里的第一部分是关于 % 通配符 (techonthenet.com/sql/like.php).. 无论如何,使用 _ 会中断查询。一旦我将它们分开( num 和 name ),查询就不起作用了。
  • @Razh 我希望输出找到所有街道名称,包括 Dr、Drive、Rd、Road。如果我在搜索中仅使用 Dr,则会出现此结果:cl.ly/image/0T1A1V190343,但如果我要搜索与 3033 Old Stone Drive 相同的地址,则不会出现任何结果。
  • 一个选项是尝试从 '%{$address}%' 中取出前面的 '%' 这样它看起来像 '{$address}%' 然后如果你输入 3033 old stone 它应该根据数据库中的内容返回旧石 Dr 或 Drive。我不得不说如果它们存在于数据库中,它也会在同一搜索中返回 3033 old stone Rd 或 Road
  • 请删除您问题的更新并将其添加为下面的答案。这将有助于未来的访问者。

标签: mysql sql


【解决方案1】:

好的,很难说出您在 STREET_NUM 和 STREET_NAME 中到底有什么,但如果它适用于 000Street Dr,让我们假设这是我们的价值观。

现在我们知道了

'000' + ' ' + 'Street Dr' LIKE '%000 Street Dr%' 工作。

为什么它适用于:

'000' + ' ' + 'Street Dr' LIKE '%000 Street Drive%' ?我认为不应该。

这就是LIKE 运算符的工作原理。

要解决此问题,您需要在数据库中包含街道、车道、关闭点等的全名,而不是 Dr., St., Cl。

【讨论】:

  • 我想那么问题应该是,LIKE 运算符是正确的选择吗?应该是REGEXP 还是其他?这是一个房地产网站,大多数人会写 Drive 或 Road 以及其他人写 Rd 和 Dr。所以我需要两个搜索才能找到结果。
  • 如果你使用的是 MyISAM 表,你可以试试full-text search
  • 嗯,这是个大问题。 REGEXP 不会在这里给你任何新东西。一种可能的解决方案是在执行 LIKE 之前删除“Rd”、“Road”、“St”、“Street”等结尾,因为它们通常不存储额外信息。另一个不错的选择是在您的网站上提供一个用户应在地址字段中输入内容的示例。
  • +1,但我不建议删除结尾...在我的城市,90th Street90th Avenue 是两个截然不同的地方,相距约 25 英里。相反,您可以维护一个table of common abbreviations,然后在插入数据时对其进行规范化,方法是使用此表将缩写替换为长版本...。这也可以让您处理常见的拼写错误。
【解决方案2】:

您可以尝试以下方法:

AND CONCAT( arc_property_res.STREET_NUM, ' ', arc_property_res.STREET_NAME ) LIKE '%{$address}%'
OR '{$address}' LIKE CONCAT( '%', arc_property_res.STREET_NUM, ' ', arc_property_res.STREET_NAME, '%' )

由于“dr”是“drive”的前两个字符,因此您应该没有问题。但是,“rd”不是“road”的前两个字符,你显然会在那里遇到问题。您可能会考虑提出替换或更好的方法,尝试某种类型的全文搜索。

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 2014-09-01
    • 2021-08-05
    • 2020-11-04
    • 2023-03-28
    • 2020-01-28
    • 2018-10-18
    • 1970-01-01
    相关资源
    最近更新 更多