2013-04-20 36 views
0

我已經按照我的數據庫表:courses(體育類的整個數據),coursedata(與courses.titlecourses.description副本 - 需要FULLTEXT指數/相關搜索),sports(體育的列表),並courses_sports(關聯表) - 見下文。如何根據MySQL中的相關性將兩個表中的行彼此映射?

現在我想將的相關性映射到體育項目並自動填入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

不正確的論據反對

如何正確地實現這種映射?


其他信息:相關的表

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  
+0

你是課程表沒有coursedata_id字段使聯接coursedata ON coursedata.id = courses.coursedata_id。順便說一句,體育和課程(或coursedata)之間的共同領域是什麼?當然和coursedata完全一樣嗎? – Edper 2013-04-20 01:15:28

+0

「_you're courses table does not have coursedata_id field_」 - 對不起,這是一個錯字。請參閱編輯的文章 – automatix 2013-04-20 01:26:07

+0

「_順便說一下體育和課程之間的共同領域_」這兩個表之間沒有共同的領域。這是通過關聯表「courses_sports」實現的多對多。 – automatix 2013-04-20 01:28:33

回答

1

你忘了提供在這種情況下,您加盟運動和課程之間的公共領域。您還忘記了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使用領域,因爲這將意味着所有的運動健將稱號被比較對你也許可以遍歷並把緊貼內部的價值。

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並在兩者之間增加了一個共同的領域。

最後可能你不必加入運動表,而是遍歷它,然後匹配?也許你可以聯合所有的結果。

+0

謝謝你的回答!但我並不打算'匹配''反對'一個靜態'字符串(比如'MATCH(coursedata.title)AGAINST('Basketball')> 0')。我想要的是每個'sports.title'都'匹配'每個'coursedata.title''' AGAINST'。 – automatix 2013-04-20 10:31:19

+0

我剛更新了這個問題。 – automatix 2013-04-20 10:32:22

相關問題