我有一个房地产列表数据库,需要返回一个社区列表。现在我正在使用 mysql DISTINCT,它返回所有不同的值。我的问题是有很多社区的名称相似:示例:
Park View Sub 1
Park View
Park View Sub 2
Park View Sub 3
Great Lake Sub 1
Great Lake Sub 2
Great Lake
Great Lake Sub 3
我正在寻找一个简单的 php 或 mysql 解决方案来识别“Park View”和“Great Lake”已经存在并且只返回“Park View”和“Great Lake”。
我最初的想法是如何按长度获取排序顺序,以便短值位于顶部,然后使用 strstr 循环。这听起来像是一项艰巨的任务,我想知道 mysql 或 php 中是否有一个函数可以轻松地做到这一点。
最佳答案
这里有一些你可以尝试的东西;大概您正在寻找完全匹配和接近匹配。
首先寻找完全匹配。 然后在 REVERSED 名称上查找 LIKE 匹配项。 然后寻找具有最少额外字符的匹配项。
这是一个可以完成所有这些的查询。请注意,如果您希望这样做高效,则需要将颠倒的地名存储在索引列中。
select name
from (
select name, 0 ordinal
from place
where name = 'Park View'
union
select name, 1 ordinal
from place
where Reverse(Name) like concat(Reverse('Park View'),'%')
union
select name, 2+length(name)
from place
where name like concat('Park View','%')
) a
order by ordinal
limit 1
注意这个 UNION 查询如何使用 ordinal
来找出最佳匹配。
关于php - 模糊 DISTINCT 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12165400/