【问题标题】:Limit to only relevant results - MYSQL仅限于相关结果 - MYSQL
【发布时间】:2011-09-18 16:24:13
【问题描述】:
选择rideid, year, model, rating, SUM(Relevance) as SearchRelevance 从( SELECT Rideid, year, model, rating, 1 as Relevance FROM cars WHERE cat LIKE '%$keyword%' 联合所有 SELECT Rideid, year, model, rating, 1 as Relevance FROM cars WHERE cat2 LIKE '%$keyword2%') AS t GROUP BY Rideid ORDER BY SUM(Relevance) DESC ";

大家好,我在其他成员的帮助下得到了这个很棒的查询,它非常适合根据相关性系统对我的结果进行排序。这样,当我的两个搜索条件都被满足时,这些结果将首先排序。

问题在于,不符合两个条件(仅匹配 1 个条件)的结果显然会显示在结果中,但顺序较低。我真的想丢弃这些结果,有没有办法改进这个查询,以便返回的唯一结果是同时满足这两个条件的结果?

将 LIKE 更改为 = 不是一个选项,因为结果字段是 textareas,因此 mysql 需要在 textareas 中搜索关键字。

谢谢

【问题讨论】:

  • 这些$keyword$keyword2 值是否来自用户输入?确保您没有在此查询中引入 SQL 注入漏洞。

标签: php mysql


【解决方案1】:
    SELECT rideid, year, model, rating, SUM(Relevance) as SearchRelevance 
      FROM( 
        SELECT rideid, year, model, rating, 2 as Relevance FROM cars 
          WHERE cat LIKE '%$keyword%' AND cat2 LIKE '%$keyword2%') 
        AS t GROUP BY rideid ORDER BY SUM(Relevance) DESC

【讨论】:

  • +1 用于删除联合,但您也可以摆脱外部 select 和 group by 子句。但是,如果 OP 想要做 relavence >2,它也可能不起作用
【解决方案2】:

您可以在GROUP BY rideid 之后将HAVING SUM(Relevance) = 2 添加到外部SELECT,因为Relevance 是匹配条件的计数。 (如果您稍后添加更多条件,则需要将 2 替换为更大的数字以匹配。)

但是,您也可以用更简单的方式编写整个查询:去掉子选择和UNION ALL,只做WHERE cat LIKE '%$keyword%' AND cat2 LIKE '%$keyword2%'。子选择和UNION 的全部意义在于能够获得仅匹配其中一个的结果。

【讨论】:

  • 不幸的是,添加 HAVING SUM 对我不起作用,只是一个标准的 1064 mysql 错误。我会按照你的建议尝试重写,但我想保持灵活性,有时会得到不太相关的结果(取决于用户在表单上检查的内容)
  • 抱歉,HAVING 的放置位置是对的,我之前弄错了,这行得通,谢谢!
【解决方案3】:

我是否遗漏了某些内容,或者对于同时满足这两个条件的记录,您总是会得到 SUM(Relevance)=2?

【讨论】:

  • 是的,你会得到两个匹配的 =2,但是 mysql 仍然会返回其他结果,只是排序较低。
  • 如果我是对的,并且您想通过在文本中找到关键字的次数来计算相关性,您应该查看example how to get substring count inside the text
【解决方案4】:

试试这个:

SELECT rideid, year, model, rating, SUM(Relevance) SearchRelevance
FROM( 
    SELECT rideid, year, model, rating, 1 as Relevance FROM cars 
    WHERE cat LIKE '%$keyword%' 
    UNION ALL 
    SELECT rideid, year, model, rating, 1 as Relevance FROM cars 
    WHERE cat2 LIKE '%$keyword2%'
) AS t 
HAVING SearchRelevance > 1
GROUP BY rideid 
ORDER BY SearchRelevance DESC

【讨论】:

  • 这不起作用,错误代码:'where 子句'中的未知列'SearchRelevance'
  • 谢谢!我将它与 Wyzard 的建议结合使用,效果很好!