mysql - 如何根据MySQL中的相关性将两个表的行相互映射?

标签 mysql sql mapping model-associations relevance

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

现在我想将类(class)基于相关性映射到体育项目,并自动使用此数据填充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.

此查询不起作用:

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/

相关文章:

mysql - Redis 排序 : How do I sort a redis hash key by given value?

php - 如何在不浪费内存的情况下在 PHP 中构建大型 MySQL INSERT 查询

python - Pyspark:将不同表中的列相乘

java - HashMap 到 Java 对象的映射

java - 使用 Spring 框架,在创建新文件夹后更新文件夹映射

javascript - 如果选中/取消选中,如何条件数据表复选框

javascript - 值未通过 Javascript 函数输入到 mysql 数据库中

mysql - 如何更改查询以使其更快?

mysql - 如何通过 data.stackexchange.com 获取每个标签的问题和答案?

c# - 如何将 C# 类映射到 Angular 对象