1

我正在尝试为电子邮件线程创建一个 dbase 解决方案。当我收到一封电子邮件时.. 我想知道这封电子邮件是否属于现有线程。

所以我匹配主题即主题='cool bro'匹配're:cool bro'

我也想匹配发送者和接收者对

IE

(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不允许 MATCH使用OR:UNION而是需要 a ..

但我想不出一种方法将上述语句转换为具有以下内容的语句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

使用MATCHorLIKE '%string%'总是很慢。您也许可以使用全文搜索来改善这一点,但您仍然不会走得太远。

还有另一种方法可以做到这一点,它更有效并且得到广泛支持。

根据RFC2822(和较旧的RFC822),邮件客户端程序应该在邮件头中创建和维护有助于线程支持的字段。实际上,所有已知的邮件客户端实际上都支持这一点。这些字段是:

  • Message-ID:通常看起来像<randomstring@sender.com>
  • In-Reply-To:回复此消息的消息 ID
  • 参考:此消息可能链接到的消息 ID 列表

如果您提取这些标题并将它们保存在数据库中的单独列和/或表中,您应该能够通过使用精确比较(没有MATCH '%string%')轻松创建线程,因此它会非常快。

于 2012-12-31T21:24:23.027 回答