0

私のデータベースには次のテーブルがあります: courses(スポーツ クラスの全データ)、coursedata(とのコピーを含むcourses.title--courses.descriptionインデックスFULLTEXT/関連性検索に必要)、sports(スポーツのリスト)、およびcourses_sports(関連付けテーブル) -- 以下を参照してください。

ここで、スポーツに基づいてコースの関連性courses_sportsをマッピングし、このデータを自動的に入力したいと考えています。2 つのステップが必要です。

  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     
4

1 に答える 1

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 のフィールドを使用できませんでした。これは、すべてのスポーツ タイトルが AGAINST と比較されることを意味するためです。

JOIN
    sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description) AGAINST('Martial')

50% 以上の AGAINST マッチがある場合は機能しないため、おそらく BOOLEAN モードを使用することもできます。

JOIN
    sports ON (course.commonid = sports.commonid) WHERE MATCH(coursedata.title, coursedata.description) AGAINST('Martial' IN BOOLEAN MODE)

私はSQL Fiddleサンプルを持っていますが、coursedata と sports の 2 つのテーブルしかなく、2 つの間に共通のフィールドを追加しました。

そして最後に、おそらくスポーツテーブルに参加する必要はなく、代わりにそれをトラバースしてから対戦する必要がありますか? おそらく、すべての結果を UNION することができます。

于 2013-04-20T01:53:43.343 に答える