我有一个叫做Classes的表,它存储有关College类的信息。它有专栏部门,课程和部分。我目前有一个自动完成功能,用户可以输入课程。例如,如果他们键入“ECON”,则显示ECON-E 201 12345等。自动完成查询被限制为10.排序MySQL结果的多样性
现在,我的自动填充功能的问题是它的响应没有给出多样性。如果他们键入“E”,它将显示10个ECON类,但不显示ENG(英语)类。有没有办法对响应进行排序,以尽可能多地提供部门,课程和部分(按此顺序)?
我有一个叫做Classes的表,它存储有关College类的信息。它有专栏部门,课程和部分。我目前有一个自动完成功能,用户可以输入课程。例如,如果他们键入“ECON”,则显示ECON-E 201 12345等。自动完成查询被限制为10.排序MySQL结果的多样性
现在,我的自动填充功能的问题是它的响应没有给出多样性。如果他们键入“E”,它将显示10个ECON类,但不显示ENG(英语)类。有没有办法对响应进行排序,以尽可能多地提供部门,课程和部分(按此顺序)?
它也取决于您的数据库的设置。如果你有一个名称(如“ECON”)一个单独的字段,那么你可以做:
SELECT DISTINCT course FROM classes WHERE UPPER(course) LIKE 'E'
看你的评论,请问这是怎么工作的吗? (我只检查对Department_Code,但在地方,你可以有你的替换线......)
SELECT类标识码,Department_Code, Course_Code,Class_Code FROM类 GROUP BY CASE WHEN(SELECT COUNT(DISTINCT Department_Code)= 1 FROM 类WHERE Department_Code LIKE '% “ 。$ q。” %')THEN ELSE类标识码 Department_Code末端具有 Department_Code LIKE '% “$ q。” %' LIMIT 10
这将只返回一个记录对于以'E'开头的每个部门的rd,但是如果用户输入'ENG',那么'ENG'的所有课程将被取消。
有一种方法可以做到这一点,尽管它取决于你想要在哪里做到这一点。例如,你希望MySQL执行分隔还是要将其推送到服务器端脚本来划分/分散数据?
就我个人而言,我认为这是一种可能性,用不同的查询查询数据库一次或两次以使数据多样化。比如“SELECT * FROM classes WHERE couse like e”,然后可能取得第一个结果,比如“ECON ...”,然后在下一个查询上做“SELECT * FROM classes WHERE!(当然就像”ECON“)”
如果你想要服务器端脚本多样化,它将需要查询一个更大的数据集,而不是10.可以说50.从这你可以返回0,1,2,3,4,20,30,40,49 ,50个结果集。这可能不是最聪明的方式,它也需要你从数据库中提取更大的数据集。
原始SELECT:
SELECT Class_ID, Department_Code, Course_Code, Class_Code, FROM Classes WHERE REPLACE(REPLACE(REPLACE(CONCAT(Department_Code, Course_Code, Class_Code), '-', ''), '(', ''), ')', '') LIKE '%". $q ."%' LIMIT 10
地域分查询:(我会用它来代替上面原有的以保持它短)
<originalQuery> UNION SELECT * FROM Classes WHERE SUBSTRING(<originalQuery>,1,1) LIKE '%".$q."%'
这也许不完全,但基本的想法是你希望你的原始结果集(联合的左侧)与第二个查询一起,并在结果中调用一个子串,因此在你的例子中,可能“E”就像用户查询一样。希望这会产生混合效果,我觉得它不太对,但它应该让你知道你能做什么。
我宁愿去做SQL端,因为我认为它会更快办法。 我发布了当前自动完成查询作为对问题的评论 – babonk 2010-07-25 01:23:32
当前的自动完成查询(不排序的多样性): SELECT类标识码,Department_Code,Course_Code,Class_Code,从阶层的WHERE REPLACE(REPLACE(REPLACE(CONCAT(Department_Code,Course_Code,Class_Code), ' - ', ''),'(',''),')','')LIKE'%“。$ q。”%'LIMIT 10 – babonk 2010-07-25 01:24:16