1

メールスレッド用の dbase ソリューションを作成しようとしています。メールを受信したとき.. このメールが既存のスレッドに属しているかどうかを知りたいです。

だから私は件名を一致させます。

また、送信者と受信者のペアを一致させたい

すなわち

(sender = 'A@gmail.com' and receiver = 'B@gmail.com')

また

(sender ='B@gmail.com' and receiver = 'A@gmail.com')

これらの正確なケースについて..このクエリはうまくいきました(詳細はこちらをご覧ください):

(SELECT COUNT(search_email.threadID) FROM search_email 
                                                        WHERE search_email.subject MATCH '%query%'  AND 
                                                        (
                                                            (search_email.sender = '%sender' AND search_email.tos = '%receiver%')
                                                            OR 
                                                            (search_email.sender = '%receiver%' AND search_email.tos = '%sender%')
                                                        )

問題は、次のような場合です。

(sender = 'Amanda Collins A@gmail.com' and receiver = 'B@gmail.com')

また

(sender ='Billy Bob B@gmail.com' and receiver = 'A@gmail.com')

明らかに.. MATCH 句 (またはいくつかの正規表現など) がここに用意されています..

問題は、sqllite での作業が許可されていないこと です:代わりにaが必要です..MATCHORUNION

しかし、上記のステートメントを次のステートメントに変換する方法がわかりませんでしたUNION/INTERSECT

SELECT * FROM search_email WHERE 
                    search_email.subject MATCH '%query%'  INTERSECT SELECT * FROM 
                                        (SELECT * FROM  (SELECT * FROM search_email WHERE 
                                                                                    search_email.sender MATCH '%sender%' 
                                                                                 INTERSECT SELECT * FROM search_email WHERE search_email.tos MATCH '%receiver%' )
                                        UNION 
                                                                            SELECT * FROM(      SELECT * FROM search_email WHERE search_email.sender MATCH '%sender%' 
                                                                                 INTERSECT SELECT * FROM search_email WHERE search_email.tos MATCH '%receiver%'))

何か案は?

更新: 答えは、最初のものintersectをに変更するだけのようですunion:

SELECT * FROM search_email WHERE 
                    search_email.subject MATCH '%query%'  UNION SELECT * FROM 
                                        (SELECT * FROM  (SELECT * FROM search_email WHERE 
                                                                                    search_email.sender MATCH '%sender%' 
                                                                                 INTERSECT SELECT * FROM search_email WHERE search_email.tos MATCH '%receiver%' )
                                        UNION 
                                                                            SELECT * FROM(      SELECT * FROM search_email WHERE search_email.sender MATCH '%sender%' 
                                                                                 INTERSECT SELECT * FROM search_email WHERE search_email.tos MATCH '%receiver%'))

しかし、この解決策は非常に非効率的です..mysqlコンパイラはそれを理解するのに時間がかかります..もっと効率的な方法はありますか?

4

1 に答える 1

0

MATCHまたはの使用LIKE '%string%'は常に非常に遅くなります。全文検索を使用してそれを改善できるかもしれませんが、それでもそれほど遠くまでは行きません。

これを行う別の方法があります。これは、より効率的で、広くサポートされています。

RFC2822(および古いRFC822 )によると、メールクライアントプログラムは、スレッドサポートを容易にするメールヘッダーのフィールドを作成および維持する必要があります。実際には、すべての既知のメールクライアントが実際にそれをサポートしています。それらのフィールドは次のとおりです。

  • メッセージID:通常は次のようになります<randomstring@sender.com>
  • In-Reply-To:message-これが返信されたメッセージのID
  • 参照:このメッセージがリンクされている可能性のあるメッセージIDのリスト

これらのヘッダーを抽出し、データベース内の個別の列やテーブルに保存すると、正確な比較(no MATCH '%string%')を使用してスレッドを簡単に作成できるため、非常に高速になります。

于 2012-12-31T21:24:23.027 に答える