2010-07-25 87 views
1

我有一个叫做Classes的表,它存储有关College类的信息。它有专栏部门,课程和部分。我目前有一个自动完成功能,用户可以输入课程。例如,如果他们键入“ECON”,则显示ECON-E 201 12345等。自动完成查询被限制为10.排序MySQL结果的多样性

现在,我的自动填充功能的问题是它的响应没有给出多样性。如果他们键入“E”,它将显示10个ECON类,但不显示ENG(英语)类。有没有办法对响应进行排序,以尽可能多地提供部门,课程和部分(按此顺序)?

+0

当前的自动完成查询(不排序的多样性): 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

回答

1

它也取决于您的数据库的设置。如果你有一个名称(如“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'的所有课程将被取消。

+0

查询必须选择LIMIT = 10的部门,课程和部分(单独的列)。 – babonk 2010-07-25 01:22:02

+1

babonk - 请参阅上面的编辑..我希望以某种方式帮助你! – PIM 2010-07-25 02:58:23

1

有一种方法可以做到这一点,尽管它取决于你想要在哪里做到这一点。例如,你希望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”就像用户查询一样。希望这会产生混合效果,我觉得它不太对,但它应该让你知道你能做什么。

+0

我宁愿去做SQL端,因为我认为它会更快办法。 我发布了当前自动完成查询作为对问题的评论 – babonk 2010-07-25 01:23:32