【发布时间】:2011-05-29 02:35:11
【问题描述】:
我的网站上有一个自动完成功能,用户可以在其中输入他们学校的课程。然后,它提供了一个下拉列表,其中包含他们在字段中某处输入的单词。 Classes 表具有 Class_ID、Term_ID、Department_Code、Course_Code、Class_Code、Course_Title、Instructor 字段,这些字段都由用户输入的术语进行搜索。假设用户输入单词“international econ”。然后它将在字段中搜索这两个术语,如下所示:
SELECT Class_ID, Department_Code, Course_Code, Class_Code, Course_Title, Instructor FROM Classes AND ((REPLACE(REPLACE(REPLACE(CONCAT(Department_Code, Course_Code, Class_Code), '-', ''), '(', ''), ')', '') LIKE '%international%' OR Instructor LIKE '%international%' OR Course_Title LIKE '%international%') AND (REPLACE(REPLACE(REPLACE(CONCAT(Department_Code, Course_Code, Class_Code), '-', ''), '(', ''), ')', '') LIKE '%econ%' OR Instructor LIKE '%econ%' OR Course_Title LIKE '%econ%')) LIMIT 10
关于这个查询的两个快速说明——我做了 REPLACE() 和 CONCAT() 以便用户可以输入部门/课程/部分作为一个单元,例如ECON-101(一个部门和一个课程一起)。此外,我还粘贴了一个大大简化的查询,省略了我目前的排序和分组方式。
但是我的问题涉及如何对结果进行排序。我希望在顶部返回与 Class_Code 匹配的条目,然后是 Course_Code,然后是 Dept,然后是 Course_Title,最后是 prof。换句话说,我希望结果按用户在自动完成中提供的具体程度排序。如果他们知道 Class_Code,我希望它位于顶部。
我想不出一种不需要大量查询的方法。到目前为止,我能想到的唯一方法是将每个术语的一堆 LIKE 比较别名到每个字段,然后按这些别名排序。这相当于用户在自动完成中输入的字数的 5 倍。换句话说,这是一个非常丑陋的查询。
有没有一种简单有效的方法来进行这种排序?如果有类似 INSTR() 函数需要 multiple 字符串进行搜索,我可以轻松地将自动完成中的所有单词与每个字段进行比较,并始终对由此产生的 5 个别名进行排序.
欢迎提出任何意见,即使这是超出问题范围的一般性建议。但是,我想提前说明一下,我不想在这里使用 FULLTEXT 之类的东西或 Sphinx 之类的搜索系统,因为我觉得它不适合像这样的非密集型快速查询。另外,我不接受重组我的数据库。所以我想用一个很好的 MySQL 查询来做这件事。
提前谢谢..
【问题讨论】:
标签: mysql search autocomplete sql-order-by sql-like