【问题标题】:How to search for city in a record in MySQL如何在 MySQL 的记录中搜索城市
【发布时间】:2010-06-26 10:51:34
【问题描述】:

我必须按城市搜索用户,但我的问题是在city 字段的用户表中 像 arizona@losvegas 这样的城市有两个,因为在注册时用户可以选择两个城市。

那么如何按城市名称搜索城市?
比如有人从arizona搜索所有用户...

我已经通过在SELECT 查询中使用LIKE 来做到这一点,但我想要一些其他方法来做到这一点。

【问题讨论】:

  • 每一行有一个城市不是更好吗?让搜索更轻松

标签: php sql mysql


【解决方案1】:

我在这里进行了疯狂的猜测,并假设海报的问题是,它也可能与其他城市中包含的城市相匹配(但是想不出这样的例子)。为了克服这一点,可以使用如下三个谓词:

WHERE city LIKE 'arizona@%' 
OR city like '%@arizona'
OR city like 'arizona'

然而,在我看来,将两个城市组合在一个列中首先是糟糕的设计。为什么不做两列,为每个城市做一行,或者做一个额外的表格,将引用与用户联系起来。

【讨论】:

    【解决方案2】:

    嗯,显而易见的方法是使用like。我不知道你为什么不想使用它:

    select * from users where city like '%arizona%';
    

    也许您可以说出您为什么要避免LIKE,并且有人会尝试给您一些想法。如果您需要比 LIKE 更好的模式匹配器,您可以使用 REGEXP 运算符。

    【讨论】:

    • 我想知道这个问题的其他方法,他们还有其他方法吗?
    • 我在答案中添加了 REGEXP 运算符。
    • 就在我用正则表达式写答案的时候:)
    【解决方案3】:

    我有点困惑为什么数据库没有为每个用户提供多个城市元组。但是,如果您想要一种更强大的方式在 MySQL 中进行搜索,您可以使用 regular expressions 搜索列中的文本:

    SELECT name FROM employees WHERE name RLIKE 'P$'
    

    这匹配以 P 结尾的员工姓名,因为 $ 是字符串锚点的结尾。您还可以执行以下操作:

    SELECT username FROM userTable WHERE city RLIKE '[Mm]assachusett?s'
    

    ...如果,上帝保佑,人们不知道马萨诸塞州有两个“t”之类的。

    正则表达式非常强大,所以如果你想使用它,你可以。但老实说,考虑到您要查找的内容,使用LIKE '%arizona%' 效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多