MySQL:需要从地址表

时间:2017-12-17 20:52:47

标签: mysql

我有一张桌子,其中包含一个指定某些地方街道地址的字段。我试图找出一种方法,当它们与给定的搜索词匹配时,从该表中返回JUST街道名称的子集。

到目前为止,我有这个:

SELECT `street` FROM `addresses` 
WHERE (`street` LIKE '%searchTerm%')
GROUP BY `street` 
ORDER BY LOCATE('searchTerm',`street`) 
LIMIT 10;

当然,除了返回包括房子#在内的整个街道地址有不必要的副作用外,哪个方面没有问题,其中我想要的只是街道本身的名称。然而,我不知道如何剥离任何前导数字,破折号或#-signs并从查询中收集街​​道名称?

有办法做到这一点吗?或者我在检索数据后只是在代码(PHP)中管理结果?

谢谢!

2 个答案:

答案 0 :(得分:1)

根据我的理解,您只需要通过查找模式的最近空格来分隔整个街道名称'%searchTerm%'。 它在MySQL中是可行的,但我建议在代码中执行它。如果你真的需要它在数据库级别,我会将它放入documented requirements

这是在MySQL中运行的代码。 (经过一些修改后可以在查询中使用它 - 但我不推荐它:))

SET @STREET='tree';
SET @HAYSTACK='Some man lives at some street 15 in some town in some country';
SET @STREET_START=locate(@STREET, @HAYSTACK) ;
-- first space
SET @FULL_STREET_START=@STREET_START - (SELECT locate(' ', 
reverse(substring(@HAYSTACK,1, @STREET_START )))) + 1;
-- last space
SET @FULL_STREET_END=LENGTH(@STREET) + locate(' ', 
substring(@HAYSTACK,@STREET_START+LENGTH(@STREET))) + 1;
SELECT substring(@HAYSTACK, @FULL_STREET_START, @FULL_STREET_END);
-- result
+------------------------------------------------------------+
| substring(@HAYSTACK, @FULL_STREET_START, @FULL_STREET_END) |
+------------------------------------------------------------+
|  street                                                    |
+------------------------------------------------------------+

答案 1 :(得分:0)

好的,所以在听了上面的评论/建议之后,给出了我具体用例的细节(我通常可以假设字符串中第一个空格之前的任何内容都是一次性信息)我最终得到了以下查询,实际上效果很好:

SELECT
    SUBSTRING(`street`,LOCATE(' ',`street`)+1,LENGTH(`street`)) AS `streetSearch`
FROM `addresses`
WHERE `street` LIKE ('%searchTerm%')
GROUP BY SUBSTRING(`street`,LOCATE(' ',`street`)+1,LENGTH(`street`))
ORDER BY LOCATE('searchTerm',`street`)
LIMIT 10;

虽然我意识到大量的东西被视为理所当然,但鉴于我正在使用的表中的数据,此解决方案在99%的时间内工作(即它没有&#到目前为止,在测试中产生了任何假阳性/阴性。

谢谢!