如何在MySQL中基于相关性将两个表的行相互映射



我的数据库中有以下表:courses(体育类的全部数据),coursedata (courses.titlecourses.description的副本-需要FULLTEXT索引/相关性搜索),sports(运动列表)和courses_sports(关联表)-见下文。

现在我想将基于的课程相关性映射到体育项目,并将此数据自动填充courses_sports。它需要两个步骤。

  1. 使用适当的SELECT收集数据。

  2. 将数据写入关联表

这篇文章是关于第一步。我在写这个查询时有一些困难。我试过的:
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运动表,而是遍历它,然后匹配?也许你可以把所有的结果联合起来

相关内容

  • 没有找到相关文章

最新更新