我的数据库中有以下表格:courses(体育课的整个数据),coursedata(带有courses.titlecourses.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)


最后,您不能在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,并在两个表之间添加了一个公共字段。

最后,也许您不必加入运动桌,而是遍历运动桌然后与之对抗?也许您可以将所有结果都结合起来。

关于mysql - 如何根据MySQL中的相关性将两个表的行相互映射?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16115162/

10-10 04:07