2009-03-16 14 views
1

私は3つのテーブル、メッセージ、件名とmessage_subject_relを持っています。アイデアは、多くの主題に関連するメッセージを持つことです。次に、クロス・サブジェクト・サーチを行います。Mysqlでこのクエリを実行するには?

私がメッセージを持っているとしましょう:私はメッセージを検索したい場合は

Id: 1, message_id: 1, subject_id: 1 
Id: 2, message_id: 1, subject_id: 2 

Id: 1, Message: This is a message 

2科目:

Id:1, Subject: Math 
Id:2, Subject: Science 

て行く2つのmessage_subject_relのエントリがありますがそれは数学に関連しているので、私は3つのテーブルと簡単な結合を行い、where句は私はどのようにするかわからないが、数学と科学に関連するメッセージを検索することである。 私はのようなもので、テーブルを取得し、単純なに参加しない場合は、次のメッセージの行を

id message  user_id  created_at ip id message_id subject_id id subject 

そして、私はwhere subject = "Math" and subject = "Science"を行う場合は、各メッセージにのみ、各行に関連した1つの主題を持つことになりますので、私は文句を言わない任意の結果を得るが、重複1件以上の件名を持つ

だから、あなたは何をお勧めしますか?

答えて

3

これは基本的にFiltering from join-table

と同じ質問です(対象= "科学" どこからMESSAGE_ID [テーブルと合流]を選択)では、MESSAGE_ID

私はその質問から私の答えを適応させます。ソリューションBY

SELECT m.* 
FROM messages m 
JOIN message_subject_rel ms1 ON (m.id = ms1.message_id) 
JOIN subjects s1 ON (ms1.subject_id = s1.id AND s1.subject = 'Math') 
JOIN message_subject_rel ms2 ON (m.id = ms1.message_id) 
JOIN subjects s2 ON (ms2.subject_id = s2.id AND s2.subject = 'Science'); 

GROUP:

は解決策を登録しよう。あなたはすべてメートルをリストする必要が

注* GROUP BY句の列、MySQLを使用しない限り。

SELECT m.* 
FROM messages m 
JOIN message_subject_rel ms ON (m.id = ms.message_id) 
JOIN subjects s ON (ms.subject_id = s.id) 
WHERE s.subject IN ('Math', 'Science')) 
GROUP BY m.id, ... 
HAVING COUNT(*) = 2; 

サブクエリ溶液:

SELECT m.* 
FROM messages m 
WHERE m.id = ANY (SELECT message_id 
        FROM message_subject_rel ms JOIN subjects s 
        ON (ms.subject_id = s.id) 
        WHERE s.subject = 'Math') 
    AND m.id = ANY (SELECT message_id 
        FROM message_subject_rel ms JOIN subjects s 
        ON (ms.subject_id = s.id) 
        WHERE s.subject = 'Science'); 

変性基溶液BY:

簡素化GROUP BY句サブクエリで検索を単離することによって。

SELECT m.* 
FROM messages m 
WHERE m.id IN (
    SELECT ms.message_id FROM message_subject_rel ms JOIN subjects s 
    ON (ms.subject_id = s.id) 
    WHERE s.subject IN ('Math', 'Science')) 
    GROUP BY ms.message_id HAVING COUNT(*) = 2 
); 

PS:あなたのmessage_subject_rel表はID列を必要としない理由はありません。

0

where節でインナーセレクトを実行します。

FROM SELECT [テーブルと合流] WHERE件名= "数学" AND

+0

それはうまくいくかもしれませんが、件名がたくさんあるメッセージがあります。そのためには避けたいのですが、どうなるか見てみましょう – DFectuoso

関連する問題