我的数据库中有以下表格: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 不正确的反对论点
如何正确实现此映射?
附加信息:相关表
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=utf8sports
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 发布于 2013-04-20 01:53:43
你忘了提供运动和课程之间的共同领域,在这种情况下,你加入了。您还忘记了比赛前的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)最后,您不能在sports.title中使用该字段,因为这意味着所有要与您比较的体育标题可能会遍历,并将值放在“反对”中。
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示例,但只有两个表,即课程数据和体育数据,并在两者之间添加了一个公共字段。
最后,也许你不需要加入运动桌,而是遍历它,然后再与之比赛?也许你可以把所有的结果结合起来。
https://stackoverflow.com/questions/16115162
复制相似问题