1

我正在使用此查询在表内搜索:

SELECT 
   *,
   MATCH(tags,title,description) 
      AGAINST ('hey you are you in' IN BOOLEAN MODE) AS score 
FROM table  
ORDER BY insert_datetime DESC, id DESC 

我需要的是使用别名'score'来排序结果,这是正确的sintax吗?:

SELECT 
   *,
   MATCH(tags,title,description) 
     AGAINST ('hey you are you in' IN BOOLEAN MODE) AS score 
FROM table  
ORDER BY score DESC, insert_datetime DESC, id DESC 

反正还有优化这个查询吗?更好的写法?

4

1 回答 1

1
  1. 这是正确的语法吗?

    是的。如SELECT语法中所述:

    select_expr可以使用 为A指定别名。别名用作表达式的列名,可用于、或子句。AS alias_nameGROUP BYORDER BYHAVING

  2. 反正还有优化这个查询吗?更好的写法?

    如果您不需要结果集中的相关性分数,则无需选择它:

    SELECT   *
    FROM     table  
    ORDER BY MATCH(tags, title, description) AGAINST (
               'hey you are you in' IN BOOLEAN MODE
             ) DESC, insert_datetime DESC, id DESC
    

    但遗憾的是,正如ORDER BY优化下所建议的那样,MySQL 无法避免在按函数结果排序时进行文件排序,例如MATCH() ... AGAINST()

    在某些情况下,MySQL 可以使用索引来满足ORDER BY子句,而无需进行任何额外的排序。

    即使ORDER BY索引不完全匹配索引,也可以使用索引,只要索引的所有未使用部分和所有额外ORDER BY列都是WHERE子句中的常量。

    但是,可以:

    • 通过使用WHERE子句仅过滤结果集以获取感兴趣的记录,从而减少必须排序的结果数量;和/或

    • ORDER BY通过从子句中删除不需要的列来减少每个排序步骤需要执行的最大比较次数。

于 2012-09-14T10:09:10.863 回答