2017-03-19 9 views
0

私はessaysと呼ばれるテーブルを持っています。テーブルはparagraphsというテーブルと1対Mの関係になっています。したがって、paragraphsテーブルにはessayを指す外部キーがあります。複数行にわたるMySQLフルテキスト検索

現在の問題は、私が検索すると、MySQLは個々の段落を調べますが、複数の段落が同じ本を指すことはできないということです。

私の全文検索は、次のようになります。

SELECT DISTINCT *, 
MATCH(essays.title) AGAINST('my search') as tscore, 
MATCH(paragraphs.content) AGAINST('my search') as cscore 
FROM essays 
INNER JOIN paragraphs ON paragraphs.essay_id = essays.id 
WHERE 
MATCH(essays.title) AGAINST('my search') 
OR MATCH(paragraphs.content) AGAINST('my search') 
ORDER BY (3 * tscore + cscore) DESC 

エッセイのすべての段落全体で何かのためのMySQLの検索を行うと、ちょうどそのエッセイを返す方法はありますか?

+0

'GROUP BY essays.id'を使用しますか? –

答えて

0

このような機能はありますか? GROUP BYを使用しているときに理由がポップアップかもしれない不要な集約問題のSELECT *を使うべきではありません

SELECT essays.id, essays.title, 
    MATCH(essays.title) AGAINST('my search') as tscore, 
    MATCH(paragraphs.content) AGAINST('my search') as cscore 
FROM essays 
    INNER JOIN paragraphs ON paragraphs.essay_id = essays.id 
WHERE 
    MATCH(essays.title) AGAINST('my search') 
    OR MATCH(paragraphs.content) AGAINST('my search') 
GROUP BY essays.id 
ORDER BY (3 * tscore + cscore) DESC; 

注:あなたはまた、代わりにHAVINGのWHERE句を使用することができますが、その後必要に

SELECT essays.id, essays.title, 
    MATCH(essays.title) AGAINST('my search') as tscore, 
    MATCH(paragraphs.content) AGAINST('my search') as cscore 
FROM essays 
    INNER JOIN paragraphs ON paragraphs.essay_id = essays.id 
GROUP BY essays.id 
    HAVING tscore > 0 OR cscore > 0 
ORDER BY (3 * tscore + cscore) DESC; 

+0

提案してくれてありがとう、これは少なくとも私が最初に試したものに近いです! SELECT句の式#4はGROUP BY句にはなく、集約されていない列が含まれています。 '句' GROUP BY句の列に機能的に依存しないuni.paragraphs.content 'これはsql_mode = only_full_group_by'と互換性がありません。 – cgf

+0

代わりにHAVINGを使用して正しい構文で私の答えを更新しました。これがうまくいくかどうか教えてください –

+0

私は残念なことに同じことをします。私は時間を得て更新を掲載するときに私はこのものに戻るでしょう。アイデアありがとう! – cgf

関連する問題