我的声明如下:
AND ( CONCAT( arc_property_res.STREET_NUM, ' ', arc_property_res.STREET_NAME ) LIKE '%{$address}%'
NUM
和NAME
位于不同的列中。目前这个查询有效,如果我有一个输入字段并输入: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}')
在某些情况下,我输入的地址不会先出现。请注意正确的列表在那里,它不是第一个。
示例:
有什么想法吗?
答案 0 :(得分:2)
好的,很难说出你在STREET_NUM和STREET_NAME中究竟有什么,但如果它适用于000
而Street Dr
让我们假设这是我们的值。
现在我们知道了
'000' + ' ' + 'Street Dr' LIKE '%000 Street Dr%'
工作了。
为什么它适用于:
'000' + ' ' + 'Street Dr' LIKE '%000 Street Drive%'
?我认为不应该。
这就是LIKE
运营商的工作方式。
要解决此问题,您需要在数据库中使用街道,驱动器,关闭等的全名,而不是Dr.,St.,Cl。
答案 1 :(得分:1)
您可以尝试以下内容:
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”是“驱动器”的前两个字符,所以你应该没有问题。但是,“rd”不是“道路”的前两个字符,你显然会遇到问题。您可能会考虑更换或更好地尝试某种类型的全文搜索。