1

我需要使用一个公共键从多个表中获取 MATCH AGAINST 分数并将它们的总和组合起来。最终的目标是创建一个搜索算法,该算法将返回具有匹配 group_ID 的行。我已经构建了一个 mysql 查询,该查询尚未运行且没有错误。

如果您想知道,这是特定的错误:

警告:mysql_fetch_array():提供的参数不是有效的 MySQL 结果资源

这些是我要搜索的表:


表:jn_groups

group_ID,名称


表:jn_chat

聊天 ID、群组 ID、姓名


表:jn_events

event_ID、group_ID、标题、描述


我当前的查询如下所示:

SELECT 
    g.group_ID AS group_ID,
    g.name AS name,
    SUM(gscore + cscore + escore) AS score,
    MATCH(g.name) AGAINST (" . $query . "') AS gscore,
    MATCH(c.name) AGAINST (" . $query . "') AS cscore,
    MATCH(e.title,e.description) AGAINST (" . $query . "') AS escore 
FROM jn_groups g 
LEFT JOIN jn_chat c ON g.group_ID = c.group_ID 
LEFT JOIN jn_events e ON g.group_ID = e.group_ID 
WHERE 
    MATCH(g.name) AGAINST (" . $query . "') 
    OR MATCH(c.name) AGAINST (" . $query . "')
    OR MATCH(e.title,e.description) AGAINST (" . $query . "') 
ORDER BY score

任何帮助进行类似于该运行的查询将不胜感激!

4

1 回答 1

2

有两件事可能是打破此查询的原因:

多变的$query

您所有的 AGAINST 运算符都以 结尾"',但仅以 开头"。确保$query包含

  • 有效数据和
  • '.

总结部分结果

SUM不会工作,因为它不知道gscore,cscoreescore. 它将寻找字段名称。您可以像这样更改语句的这一部分(ofc 替换hello world为您想要的搜索词):

....
SUM(
    (MATCH(g.name) AGAINST ('hello world'))
    + (MATCH(c.name) AGAINST ('hello world'))
    + (MATCH(e.title,e.description) AGAINST ('hello world'))
) AS score,
....

两个建议:

  • 尝试首先使用 SQL 工具(pe SQLyog、MySQL Workbench、phpMyAdmin 或类似工具)对您的数据库运行查询,以查看它是否按您希望的方式工作。还有其他几种方法可以解决这个问题(pe no 或错误的全文索引定义,错误的字段名称等),因此您可以更好地控制发生了什么问题。
  • NAME使用保留变量(如字段名称)时要小心。要么正确地逃避它们,要么 - 在我看来更好 - 避免它们。
于 2012-06-06T08:46:30.067 回答