我的数据库中有以下表格:courses
(体育类(class)的完整数据),coursedata
(包含courses.title
的副本和courses.description
- FULLTEXT
索引/相关性搜索所需)、sports
(体育项目列表)和 courses_sports
(关联表)--见下文。
现在我想将类(class)基于相关性映射到体育项目,并自动使用此数据填充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.
此查询不起作用:
Error Code: 1210
Incorrect arguments to AGAINST
如何正确实现这个映射?
<小时/>其他信息:相关表格
类(class)
Field Type Key
------------------ --------------- ------
id int(11) PRI
title varchar(100)
description varchar(1000)
coursedata_id int(11) UNI
...
类(class)数据
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
运动
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
最佳答案
您忘记提供您参加的运动和类(class)之间的共同领域。您还忘记了 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)
最后,您不能在 sports.title 中使用该字段,因为这意味着要与所有体育标题进行比较,您可能可以遍历并将值放入 AGAINST 中。
JOIN
sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description) AGAINST('Martial')
也许你也可以使用 BOOLEAN 模式,因为如果你有 50% 或更多的 AGAINST 匹配,它就不起作用
JOIN
sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description) AGAINST('Martial' IN BOOLEAN MODE)
我有一个SQL Fiddle示例,但只有两个表,即 coursedata 和 sports,并在两者之间添加了一个公共(public)字段。
最后,您可能不必加入运动表,而是遍历它然后进行比赛?也许您可以将所有结果合并起来。
关于mysql - 如何根据MySQL中的相关性将两个表的行相互映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16115162/