【问题标题】:MySQL full text search, why am I getting Incorrect arguments to MATCHMySQL 全文搜索,为什么我的 MATCH 参数不正确
【发布时间】:2010-04-09 20:47:52
【问题描述】:
SELECT 
* 
FROM 
company c
INNER JOIN 
city ci ON ci.city_id = c.city_id
INNER JOIN 
state s ON s.state_id = c.state_id
WHERE 
MATCH (
c.name, ci.name, c.zipcode, s.name
)
AGAINST (
'los angeles'
)

【问题讨论】:

  • 这个问题非常相关:stackoverflow.com/questions/2378366/… 虽然我不认为他们是骗子,因为这个问题并没有“预先知道”由于JOIN 而可能出现的问题。跨度>

标签: mysql


【解决方案1】:

我遇到了同样的问题并这样解决了:

SELECT 
* 
FROM 
company c
INNER JOIN 
city ci ON ci.city_id = c.city_id
INNER JOIN 
state s ON s.state_id = c.state_id
WHERE 
   MATCH (c.name) AGAINST ('los angeles')
OR MATCH (ci.name) AGAINST ('los angeles')
OR MATCH (c.zipcode) AGAINST ('los angeles')
OR MATCH (s.name) AGAINST ('los angeles')

但正如我所见,您正在搜索“姓名”和“邮政编码”等简单字段。至于我,最好使用LIKE 并将它们连接起来

SELECT 
* 
FROM 
company c
INNER JOIN 
city ci ON ci.city_id = c.city_id
INNER JOIN 
state s ON s.state_id = c.state_id
WHERE 
CONCAT_WS (' ', c.name, ci.name, c.zipcode, s.name)
LIKE ('%los angeles%')

【讨论】:

  • 小心使用 CONCAT_WS,这样会匹配一个名为“Hellos”的公司在一个名为“Angeles”的城市中的结果。一个不太可能遇到的错误,但仍然是一个潜在问题。
  • 这确实应该被标记为答案。这是解决单表限制的一种非常聪明的方法。通过全文搜索从 MySQL MyISAM 迁移到 MariaDB InnoDB,这是“移植”原始查询的快速方法。
【解决方案2】:

MATCH (...) 中的所有列必须来自同一个表,因为它们必须是全文索引,并且 MySQL 不能为多个表中的数据创建一个索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2012-01-10
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多