1

共通のキーを持つ複数のテーブルからMATCHAGAINSTスコアを取得し、それらの合計を組み合わせる必要があります。最終的な目標は、group_IDが一致する行を返す検索アルゴリズムを作成することです。エラーなしでまだ実行されていないmysqlクエリを作成しました。

知りたい場合は、これが特定のエラーです。

警告:mysql_fetch_array():指定された引数は有効なMySQL結果リソースではありません

これらは私が検索したいテーブルです:


テーブル:jn_groups

group_ID、名前


テーブル:jn_chat

chat_ID、group_ID、name


テーブル:jn_events

event_ID、group_ID、title、description


私の現在のクエリは次のようになります。

SELECT 
    g.group_ID AS group_ID,
    g.name AS name,
    SUM(gscore + cscore + escore) AS score,
    MATCH(g.name) AGAINST (" . $query . "') AS gscore,
    MATCH(c.name) AGAINST (" . $query . "') AS cscore,
    MATCH(e.title,e.description) AGAINST (" . $query . "') AS escore 
FROM jn_groups g 
LEFT JOIN jn_chat c ON g.group_ID = c.group_ID 
LEFT JOIN jn_events e ON g.group_ID = e.group_ID 
WHERE 
    MATCH(g.name) AGAINST (" . $query . "') 
    OR MATCH(c.name) AGAINST (" . $query . "')
    OR MATCH(e.title,e.description) AGAINST (" . $query . "') 
ORDER BY score

その実行と同様のクエリを作成するためのヘルプをいただければ幸いです。

4

1 に答える 1

2

このクエリを破る理由となる可能性のある2つのこと:

変数$query

すべてのAGAINST-演算子はで終わります"'が、で始まるのは。だけ"です。$query含まれていることを確認してください

  • 有効なデータと
  • で始まり'ます。

部分的な結果を合計する

、、をSUM知らないので、あなたは動作しません。代わりにフィールド名を検索します。ステートメントのこの部分は、次のように変更できます(多くの場合、目的の検索語に置き換えます)。gscorecscoreescorehello world

....
SUM(
    (MATCH(g.name) AGAINST ('hello world'))
    + (MATCH(c.name) AGAINST ('hello world'))
    + (MATCH(e.title,e.description) AGAINST ('hello world'))
) AS score,
....

2つのアドバイス:

  • 最初にSQLツール(pe SQLyog、MySQL Workbench、phpMyAdminなど)を使用してデータベースに対してクエリを実行し、希望どおりに機能しているかどうかを確認してください。これを破る方法は他にもいくつかあります(フルテキストインデックスの定義が間違っているか間違っている、フィールド名が間違っているなど)。そのため、何がうまくいかないかをより適切に制御できます。
  • NAMEフィールド名のように予約変数を使用する場合は注意してください。それらを適切に脱出するか、-私の目には-それらを避けてください。
于 2012-06-06T08:46:30.067 に答える