我正在使用此查询在表格内搜索:
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
我需要的是使用别名'得分'来订购结果,这是正确的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
还有优化此查询?更好的写作方式?
答案 0 :(得分:1)
这是正确的sintax?
是。正如SELECT
Syntax所述:
可以使用
select_expr
为AS alias_name
指定别名。别名用作表达式的列名,可用于GROUP BY
,ORDER BY
或HAVING
< / strong>条款。
还有优化此查询?更好的方式来写这个?
如果您不需要结果集中的相关性分数,则无需选择它:
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
Optimization所建议的那样,MySQL在通过MATCH() ... AGAINST()
等函数的结果进行排序时无法避免进行文件排序:
在某些情况下,MySQL可以使用索引来满足
ORDER BY
子句,而无需进行任何额外的排序。即使
ORDER BY
与索引不完全匹配,也可以使用索引,只要索引的所有未使用部分和所有额外的 { {1}} 列是ORDER BY
子句中的常量。
但是,有人可以:
使用WHERE
子句仅筛选感兴趣的记录的结果集,从而减少必须排序的结果数;和/或
通过从WHERE
子句中删除不需要的列来减少每个排序步骤需要执行的最大比较次数。