我的数据库中有以下表:courses
(体育类的全部数据),coursedata
(courses.title
和courses.description
的副本-需要FULLTEXT
索引/相关性搜索),sports
(运动列表)和courses_sports
(关联表)-见下文。
现在我想将基于的课程相关性映射到体育项目,并将此数据自动填充courses_sports
。它需要两个步骤。
-
使用适当的
SELECT
收集数据。 -
将数据写入关联表
SELECT
courses.id,
sports.id
FROM
courses
JOIN
coursedata ON coursedata.id = courses.coursedata_id
JOIN
sports ON MATCH (coursedata.title) AGAINST (sports.title) > 0
-- The test with
-- sports ON MATCH (coursedata.title) AGAINST ('Basketball') > 0
-- works.
这个查询不工作:
错误码:1210
AGAINST的错误参数
如何正确实现这个映射?
附加信息:相关表
courses
Field Type Key
------------------ --------------- ------
id int(11) PRI
title varchar(100)
description varchar(1000)
coursedata_id int(11) UNI
...
coursedata
Field Type Collation Null Key
----------- ------------- --------------- ------ ------
id int(11) (NULL) NO PRI
title varchar(100) utf8_general_ci YES MUL
description varchar(1000) utf8_general_ci YES MUL
CREATE TABLE `coursedata` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL,
`description` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `searchcoursetitle` (`title`),
FULLTEXT KEY `searchcoursedescription` (`description`)
) ENGINE=MyISAM AUTO_INCREMENT=5208 DEFAULT CHARSET=utf8
sports
Field Type Collation Null Key
-------- --------------------- --------------- ------ ------
id int(11) (NULL) NO PRI
title varchar(50) utf8_general_ci NO
category varchar(50) utf8_general_ci YES
type enum('sport','dance') utf8_general_ci YES
courses_sports
Field Type Collation Null Key
--------- ------- --------- ------ ------
course_id int(11) (NULL) NO PRI
sport_id int(11) (NULL) NO PRI
您忘记提供运动和课程之间的公共字段,在本例中您加入了课程。您还忘记了MATCH之前的WHERE语句。
JOIN
sports ON MATCH (coursedata.title) AGAINST (sports.title) > 0 AND
sports ON MATCH (coursedata.description) AGAINST (sports.title) > 0
所以,它应该是这样的:
JOIN
sports ON (course.commonid = sports.commonid) WHERE MATCH
既然你想要这两个coursedata。Title和coursedata.description你可以将它们匹配起来
JOIN
sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description)
最后你不能在运动中使用这个场地。title,因为这意味着所有的运动标题都要比较AGAINST,你可以遍历并将值放入AGAINST中。
JOIN
sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description) AGAINST('Martial')
,也许你也可以使用布尔模式,因为它将不工作,如果你有50%或更多的反对匹配
JOIN
sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description) AGAINST('Martial' IN BOOLEAN MODE)
我有一个SQL Fiddle示例,但只有两个表,即coursedata和sports,并在两者之间添加了一个公共字段。
最后可能你不需要JOIN运动表,而是遍历它,然后匹配?也许你可以把所有的结果联合起来