【问题标题】:MySQL UNION query correct handling for 3 or more wordsMySQL UNION 查询正确处理 3 个或更多单词
【发布时间】:2011-09-16 13:49:41
【问题描述】:

我得请你帮忙解决这个问题。

我的网站有一个搜索字段,假设用户写的是“Korg X 50”

在我的数据库“产品”表中,我有一个包含“X50”的字段“名称”和一个包含“Korg”的字段“品牌”。有没有办法使用 UNION 选项来获取正确的记录?

如果用户输入“Korg X-50”?

非常感谢!

马特奥

【问题讨论】:

  • 为什么选择 UNION?为什么不这样: WHERE name LIKE '%X50% OR brand LIKE '%Korg%' ?或者你可以使用 AND
  • @Alex K 是对的。我提供了一个“UNION”,因为这是问题所要求的,但您并不真正需要它。您需要一个 where 子句,其名称为 ... 或品牌之类 ... 或任何类似...
  • 因为我不知道用户输入了多少关键字(我认为)
  • @matteo 当用户输入三个或更多单词时,您的 RDBS 会发生什么?也许你应该使用全文搜索
  • @Everybody 非常感谢您花时间帮助我。我已经阅读了你所有的帖子,并去尝试每个人。我什至不知道什么是“全文搜索”。认为我必须更好地学习 mysql :)

标签: mysql select union


【解决方案1】:

也许你应该使用full-text search

SELECT brand, name, MATCH (brand,name) AGAINST ('Korg X 50') AS score
FROM products WHERE MATCH (brand,name) AGAINST ('Korg X 50')

【讨论】:

  • 感谢您的帮助!必须将我的索引字段更改为“全文”才能使用此权限?
  • @matteo 官方手册引用:A full-text index in MySQL is an index of type FULLTEXT
【解决方案2】:

据我了解,您不需要UNION,而是类似

SELECT * FROM table1 
WHERE CONCAT(field1, field2) LIKE '%your_string%' 

在客户端,您可以删除your_string 中出现在用户输入中且不能出现在field1field2 中的所有字符(如空格、连字符等)。

因此,用户输入 Korg X 50 以及 Korg X-50 变为 KorgX50

【讨论】:

  • @a1ex07 这个字符串会是什么:X-50 Korg?
  • @Alex K :我知道我发布的解决方案很幼稚。要处理您提到的情况,我会: 1. 拆分用户输入并创建一个数组。 2. 为每个排列创建or(当然,它只对少量片段有意义),所以我们将有WHERE CONCAT (...) LIKE '%perm1' OR CONCAT(...) LIKE %perm2` OR etc.. Another way is to do it as you said in your comment (no CONCAT, just field1 LIKE ... AND field2 like ...`),但它仍然需要拆分输入并比较每个块。
【解决方案3】:

您需要获取某种形式的可搜索文本。

要么解析多个关键字的输入并分别匹配每个关键字,要么尝试将它们全部附加在一起并匹配以相同方式附加的列。

您还需要一个正则表达式,或者可能是一个更简单的搜索和替换,以在比较之前的追加后去掉空格和破折号。

一般来说,允许用户搜索开放式文本字符串比“我使用什么联合”更复杂......理想情况下,您还会担心轻微的拼写错误和大写以及关键字顺序。

您可以考虑将所有关键字从正常记录中提取到与每个产品关联的单独关键字列表中,然后使用该列表执行搜索。

【讨论】:

    【解决方案4】:

    如果您不想解析用户输入并按原样使用,那么您将需要使用这样的查询

    select * from products where concat_ws(' ',brand,name) = user_input -- or
    select * from products where concat_ws(' ',brand,name) like %user_input%
    

    但是,如果用户输入名称“Korg X-50”并且您的表包含“Korg”和“X50”,则此查询不会返回结果,那么您需要做一些其他的事情来实现这一点。您可以查看http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex,但这不是一个完整的解决方案。寻找那个ex的文本索引库:lucene

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2020-04-23
      • 2014-04-11
      • 2014-02-13
      • 2019-06-09
      相关资源
      最近更新 更多