首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据MySQL中的相关性将两个表的行映射到彼此?

如何根据MySQL中的相关性将两个表的行映射到彼此?
EN

Stack Overflow用户
提问于 2013-04-20 00:11:06
回答 1查看 4.9K关注 0票数 0

我的数据库中有以下表格:courses (体育课的完整数据)、coursedata (带有courses.titlecourses.description的副本-- FULLTEXT索引/相关性搜索所需的)、sports (体育列表)和courses_sports (关联表) --见下文。

现在,我想要地图的课程相关性,基于体育,并填补这些数据的courses_sports自动。它需要两步。

  1. 使用分摊的SELECT收集数据。
  2. 将数据写入关联表。

这个帖子是关于第一步的。我在写查询时遇到了一些麻烦。我试过的是:

代码语言:javascript
复制
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

代码语言:javascript
复制
Field               Type             Key    
------------------  ---------------  ------ 
id                  int(11)          PRI             
title               varchar(100)                     
description         varchar(1000)                    
coursedata_id       int(11)          UNI     
...

coursedata

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
Field      Type     Collation  Null    Key     
---------  -------  ---------  ------  ------  
course_id  int(11)  (NULL)     NO      PRI     
sport_id   int(11)  (NULL)     NO      PRI     
EN

回答 1

Stack Overflow用户

发布于 2013-04-20 01:53:43

你忘了提供运动和课程之间的共同领域,在这种情况下,你加入了。您还忘记了比赛前的WHERE语句。

代码语言:javascript
复制
JOIN
    sports ON MATCH (coursedata.title) AGAINST (sports.title) > 0 AND
    sports ON MATCH (coursedata.description) AGAINST (sports.title) > 0

所以,应该是这样:

代码语言:javascript
复制
JOIN
    sports ON (course.commonid = sports.commonid) WHERE MATCH 

既然你想要coursedata.title和coursedata.description,你可以加入他们的匹配。

代码语言:javascript
复制
JOIN
    sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description)

最后,您不能在sports.title中使用该字段,因为这意味着所有要与您比较的体育标题可能会遍历,并将值放在“反对”中。

代码语言:javascript
复制
JOIN
    sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description) AGAINST('Martial')

也许你也可以使用布尔模式,因为如果你有50%或更多的匹配,它就不能工作。

代码语言:javascript
复制
JOIN
    sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description) AGAINST('Martial' IN BOOLEAN MODE)

我有一个SQL Fiddle示例,但只有两个表,即课程数据和体育数据,并在两者之间添加了一个公共字段。

最后,也许你不需要加入运动桌,而是遍历它,然后再与之比赛?也许你可以把所有的结果结合起来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16115162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档