【问题标题】:mysql query to search for address or postcodemysql查询以搜索地址或邮政编码
【发布时间】:2010-10-12 00:38:25
【问题描述】:

您好,我很难编写一个完美的 sql 查询来搜索地址或邮政编码(英语)。

我将邮政编码存储为“W1Y TF7”。如果用户使用“W1YTF7”(不带空格)进行搜索,它会在假设返回 W1Y TF7 时给我任何结果。

场地

  • 场地 ID
  • 姓名
  • 地址1
  • 地址2
  • 城市
  • 邮政编码
  • 电话号码
  • 网址

这是我的查询:

SELECT DISTINCT *
 FROM venue 
WHERE Name LIKE '%$searchValue%' 
   OR Postcode LIKE '%$searchValue%'
   OR Address2 LIKE '%$searchValue%' 
   OR Postcode LIKE '$searchValue%' 

【问题讨论】:

  • 您有 OR Postcode LIKE '%$searchValue%'OR Postcode LIKE '$searchValue%'。你确实意识到第一个条件包括第二个,对吧?

标签: php sql mysql


【解决方案1】:

我可能会将邮政编码存储在没有空间的数据库中。然后,您可以在运行 SQL 查询之前简单地去除字符串中的空格。

如果您想保留当前设置,为什么不在输入到达 SQL 级别之前将其转换为您期望的格式?如果它不存在,只需添加空间。

【讨论】:

  • 简单而优雅的解决方案。
  • 我想过这样做,但问题是因为我不知道用户在搜索什么,因为用户可以搜索地址或邮政编码,我无法开始删除空格。例如,如果用户搜索“19 arygll street”,我无法开始删除空格,因为它会产生无法识别的内容。
  • 然后设置查询匹配带空格和不带空格的字符串?
【解决方案2】:

好吧,第一个陷阱:如果事情没有启动(如果 $searchValue 是一个空字符串或一个非常小的字符串),我可以看到你在这里遇到了一些问题。这总是会返回一个非常大的数据集(并且可能需要相当长的时间)。

对于邮政编码,您可以使用(LEFT(Postcode, 3) = LEFT($searchValue, 3) AND RIGHT(Postcode, 3) = RIGHT($searchValue, 3))

另外,您可能想查看准备好的语句和值绑定,但这完全是一个不同的问题

【讨论】:

  • 我刚试过这个,它说 sql 语法错误。 LEFT 是 sql sntax 吗?
  • 我不太确定它是否是 ISO SQL,但我知道它存在于 MySQL 和 T-SQL 中(不确定 PL/SQL)(使用此语法,请参阅 dev.mysql.com/doc/refman/5.0/en/…)你给出了你正在尝试的实际 SQL 语句?
  • MySql 可能会出现反引号(我不确定)。
【解决方案3】:

您可以创建一个搜索列,创建一个名为 SearchColumn 的新字段作为场所表,然后创建一个 SELECT 和 UPDATE trigger,在您要使用的所有字段中设置相同的值(VenueID + Name + Address1 + 地址 2 + 城市 + 邮政编码 + 电话号码 + URL)。前任。如果你插入。 将其作为index 包含在内也很好。

那么你需要:

SELECT DISTINCT Name
      FROM venue
       WHERE SearchColumn LIKE '%Search value%'

【讨论】:

  • 对不起,我很困惑。我看不到更大的图景,这对搜索有何帮助。如果您不介意,请您进一步解释一下
  • 这里的想法是您添加一个列 searchColumn,其中将包含例如:“Place xW1Y TF7foostreet 77Manchester”,您将执行 where searchColumn LIKE '%user input%'。不过,这并不能帮助您处理可能间隔的邮政编码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多