【问题标题】:Better mysql select Query to filter data (PHP)更好的mysql选择查询过滤数据(PHP)
【发布时间】:2011-11-24 08:34:57
【问题描述】:

我有一个问题,我想从我的 mysql 数据库中搜索数据,这就是它的方式我有一个搜索字段,用户在其中输入位置名称,然后我在我的数据库中搜索该位置并显示基于用户名在搜索到的位置,但我有一些用户在数据库中有多个位置,用“逗号”分隔,所以我的选择查询无法找到,这就是我的数据库的外观

 table name :- users 

 username ||  location

 john    ||  KIS,ITS

 alex   || KIS

所以当有人搜索 KIS 时,它只显示 alex 的名字而不是 john 的名字,尽管他也是 KIS 的一部分,我想知道是否有更好的查询可以解决我的问题

谢谢

【问题讨论】:

  • 您是否接受输入 KIS 也会获得类似 KISKKIST 的位置?还是必须正确输入位置?
  • 顺便说一句,我会重组您的数据以使这样的查询更容易(并且可能更快)。我会有一个单独的“位置”表格,并有一个新表格将您的用户链接到您的位置。

标签: php mysql select


【解决方案1】:

针对新问题要求的更新查询

适用于

KIS,(任何)在开始时

(anything),KIS,(anything) 在中间

(随便),终于亲了

查询

SELECT * 
FROM users
WHERE location = 'KIS' OR LIKE 'KIS,%' OR LIKE '%,KIS,%' OR LIKE '%,KIS' 

【讨论】:

  • 抱歉,这对我不起作用,因为我需要与 KIS 不同的正确位置 :-(
  • 更新了完全匹配的答案
【解决方案2】:

如果您需要查找输入字符串的一部分,您可以使用

SELECT * FROM users WHERE location LIKE '%KIS%'

如果你需要得到正确的输入,你可以使用

SELECT * FROM users
WHERE FIND_IN_SET(LOWER('KIS'), LOWER(location)) > 0

【讨论】:

  • @kevin:我现在看到你的评论了;好吧,用我的第二个例子,你的工作应该完成:)
【解决方案3】:
select username from users where location like '%KIS%'

【讨论】:

    【解决方案4】:

    使用正则表达式。

    SELECT * FROM users WHERE location RLIKE '(^|[^_alnum])KIS($|[^_alnum])'
    

    或者如果你的数据总是用一个逗号分隔,那么使用这个:

    SELECT * FROM users WHERE location RLIKE '(^|,)KIS($|,)'
    

    但是要知道您的数据库不是第一范式,并且存储复杂的数据,并且查找它会极大地影响性能。如果可能,请使用单独的表来存储每个用户的位置。

    【讨论】:

    • 感谢 Zsolt,这似乎是真正的帮助,是的,我将学习遵循所有最佳实践,因为我在这里学到了很多关于堆栈溢出的知识
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多