如何转换“=”来匹配,而不是一个sqllite声明(how to convert an sqllit

2019-10-17 13:36发布

我试图创建一个电子邮件线程一个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')

显然..匹配条款(或某个正则表达式或财产以后)是为了在这里..

问题是,sqllite 不允许 MATCH一起工作OR :一个UNION是不是需要..

但我不能想出一个办法,以上面的语句转换成具有声明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的编译器需要一段时间才能弄明白..有一个更有效的方法?

Answer 1:

使用MATCHLIKE '%string%'将是总是很慢。 您可能能够改善,使用全文搜索,但你还是不会走得很远。

还有另一种方式来做到这一点,这是更有效和更广泛的支持。

根据RFC2822 (及以上RFC822 )的邮件客户端程序应该创建并维护其便于线程支持邮件头中的字段。 在实践中,所有已知的邮件客户端实际支持。 这些领域是:

  • 邮件ID:通常看起来像<randomstring@sender.com>
  • 在-回复:邮件的邮件ID这是一个回复
  • 参考文献 :邮件ID的列表,这个消息可能与

如果你提取这些报头,并将其保存在数据库中的单独columms和/或表格,你应该能够很容易地通过使用精确比较(不创建线程MATCH '%string% ”),所以这将是非常快的。



文章来源: how to convert an sqllite statement from '=' to MATCH instead