2011-07-08 48 views
1

我想在如何设置在phpMyAdmin全文索引像下面的一些指导:如何设置这个全文索引

universities: 
id 
name 

programs: 
id 
name 
university_id 

courses: 
id 
name 
program_id 

students: 
id 
name 
course_id 

搜索功能 用户只需要检索算法为学生但我想创建与students.course_id等相匹配的students.name和courses.name的全文,以便学生姓名,课程名称(学生参与),课程名称(课程在中给出)和大学名称(程序属于)都是可搜索的。

查询 如果我像上面那样构造它,将创建全文以便它可以像标准一样搜索,例如,与PDO:

$STH = $DBH->prepare('SELECT * FROM students WHERE MATCH(fulltext) AGAINST(:query IN BOOLEAN MODE)); 
$STH->bindParam(':query', $query); 

或者如何在PHP中查看pdo查询?

此外,这将是一个沉重的搜索功能?

约数:5所大学,100个课程1 000门课程和2万名学生。

回答

0

在PHP

$query= "SELECT * FROM students,courses,programes,universities WHERE MATCH(students.name,courses.name,programs.name,universities.name) AGAINST('$keyword' IN BOOLEAN MODE)" 
$result = mysql_query($query); 

$keyword是你要搜索的单词。

编辑基于注释

,认为这是你需要

SELECT name from student where name like %key% OR 
    course_id IN (SELECT id FROM course WHERE name like %key%) OR 
    course_id IN (SELECT id FROM course WHERE program_id IN (
      SELECT id FROM program WHERE name Like %key%)) OR 
    course_id IN (SELECT id FROM course WHERE program_id IN (
     SELECT id FROM program WHERE university_id in (
     SELECT id from university where name like %$key%))) 

哪里key是您正在搜索的单词。

+0

因为我只想让学生回来(如果搜索到学生姓名,或者某所大学的所有学生都搜索到了大学名称,那么匹配学生)我可以使用students.name替换'*'来实现吗? – Joseph

+0

不,为此,我认为你需要为学生,课程,程序和大学表格单独查询。 – Balanivash

+0

这就是你想要的:如果模式是在学生表中,你需要学生的名字,如果它在课程表中,那么所有的学生在该课程中,如果它在程序中,那么所有的学生在课程中,这是在该计划中,如果是在大学,那么所有的学生都在课程中,在大学提供的课程中。 – Balanivash

1

这不是FULLTEXT索引的工作方式。 A FULLTEXT索引必须位于MyISAM表中的单个文本(CHAR/VARCHAR/TEXT)列中,并允许搜索匹配该列内容中的单词。例如,您可以在课程目录中使用FULLTEXT索引以允许用户在课程描述中搜索文本。

在你的情况,你可能想要做的是创造一个“正常”(非全文)对每个students.namecourses.nameprograms.nameuniversities.name指数,然后为每个表执行一个查询和合并你自己的结果。 (例如,您可能必须显示匹配学生的结果,而不是匹配的大学的结果)。将现有的student.name字段拆分为单独的名字和姓氏字段可能会有所帮助,因为这将允许你分别搜索这两个。