MySQL多个ID查找

3

我正在尝试为一个系统添加全文搜索功能。我想要编写的查询需要包含多个查找,然后再进行搜索(如果可能的话)。

我有一个教师表和一个科目表。

teacherProfile
teacherId [int] - primary key
subjectOneId [int]
subjectTwoId [int]
subjectThreeId [int]
teacherBiography [text]

subjects
subjectId [int]
subjectName [text]

所以,最终我希望得到的结果集大致如下...
teacherId [int]
teacherBiography [text]
( subjectOneName [text] )
( subjectTwoName [text] )
( subjectThreeName [text] )

所以这三个括号中的字段不存在,但我想对它们进行文本搜索,我需要设置外键约束(这样做可能会进一步影响现有系统),还是有更好的方法?

1个回答

2

MySQL 无法对视图进行索引,因此您想要的在 MySQL 中是不可能实现的。

您可以使用外部全文索引引擎,如 Sphinx,并使用带有 JOINS 的查询将数据加载到其中。

或者,您可以创建一个非规范化的表:

CREATE TABLE ftsearch
        (
        teacherId INT PRIMARY KEY,
        teacherBiography TEXT,
        subject1 TEXT,
        subject2 TEXT,
        subject3 TEXT,
        )
ENGINE=MyISAM

并使用以下查询填充它:

INSERT
INTO    ftsearch
SELECT  teacherId, teacherBiography,
        s1.name, s2.name, s3.name
FROM    teacherProfile
LEFT JOIN
        subject s1
ON      s1.id = subjectOneId 
LEFT JOIN
        subject s2
ON      s2.id = subjectTwoId 
LEFT JOIN
        subject s3
ON      s3.id = subjectThreeId 

及时地。

实际上,如果您的所有表都是MyISAM,则可以在不创建全文索引的情况下,对于连接应用完整搜索查询(布尔模式)。

例如,如果您正在搜索'+Jones +math +physics',其中Jones是教师的姓氏,而mathphysics是科目,则可以执行此查询:

SELECT  teacherId, teacherBiography,
        s1.name, s2.name, s3.name
FROM    teacherProfile
LEFT JOIN
        subject s1
ON      s1.id = subjectOneId 
LEFT JOIN
        subject s2
ON      s2.id = subjectTwoId 
LEFT JOIN
        subject s3
ON      s3.id = subjectThreeId 
WHERE   MATCH(teacherBiography) AGAINST ('+Jones' IN BOOLEAN MODE)
        AND MATCH(t.teacherBiography, s1.name, s2.name, s3.name) AGAINST ('+Jones +math +physics' IN BOOLEAN MODE)
MATCH(teacherBiography) AGAINST ('+Jones') 将使用 teacher 上的 FULLTEXT 索引(如果有的话);第二个 MATCH 将对结果进行精细过滤。
然而,涉及 OR 条件或相关性排序的查询则更加复杂。

实际上,如果我跳过了全文搜索,那么在没有最后三个字段的情况下如何进行查找?即,获取视图的结果并对生物文本执行全文搜索? - Julian Young
抱歉 - 获取视图的文本主题查找结果并在个人简介上执行全文搜索? - Julian Young
@Julian:请提供您查询的示例(我的意思是您将放入搜索栏中的短语)。 - Quassnoi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接