2012-10-24 131 views
4

我目前正在编写一个JAVA应用程序,在该应用程序中我需要从用户雅虎电子邮件(显示回给他们)访问以下信息。 YQL看起来像这样做的“快捷方式”,但它证明更加困难。我运行的所有测试都在这里完成:http://developer.yahoo.com/yql/console/我可以使用我的webapp/oauth复制相同的结果。使用YQL从雅虎邮件访问新邮件

  • FromEmail
  • FROMNAME
  • 主题
  • 消息
  • 日期
  • MID

我有麻烦这一切都在以1个查询电话(甚至2,尽管我没有投入尽可能多的时间研究这个解决方案)。这里是它的短,目前我有以下YQL:

SELECT folder.unread, message FROM ymail.msgcontent 
    WHERE (fid,mids) 
    IN 
     (SELECT folder.folderInfo.fid, mid 
     FROM ymail.messages 
     WHERE numMid=2 
     AND startMid=0) 
     AND fid='Inbox' 
     AND message.flags.isRead=0; 

这个工作最好了所有的解决方案,我有,但有一个主要的致残缺陷。如果我们有10封电子邮件,E1 - E10,除E2,E3外都是未读邮件,那么运行该查询后,结果集将显示E1,而不是E1,E4。显然这不好。所以,我想堵“AND message.flags.isRead = 0”的子选择:

SELECT folder.unread, message FROM ymail.msgcontent 
    WHERE (fid,mids) 
    IN 
     (SELECT folder.folderInfo.fid, mid 
     FROM ymail.messages 
     WHERE numMid=10 
     AND startMid=0 
     AND message.flags.isRead=0) 
     AND fid='Inbox' 

然而,这会产生“空”的结果。为了调试这个我就跑子选择,并提出了这一点:

SELECT folder.folderInfo.fid, mid 
FROM ymail.messages 
WHERE numMid=10 
AND startMid=0 
AND messageInfo.flags.isRead=0 

该查询返回10,后不幸进一步审查,它不会过滤掉读未读VS。经过一些更多的挑逗,我把选择语句更改为以下查询:

SELECT folder.folderInfo.fid, messageInfo.mid 
FROM ymail.messages 
WHERE numMid=10 
AND startMid=0 
AND messageInfo.flags.isRead=0 

最后,这个工程!除了返回47个电子邮件而不是10个,并且使事情更有趣,我知道我的收件箱中有207封(未读)电子邮件,所以为什么47?我已经将0到300之间的'numMid'(想象成多少个)以及0到300之间的startMid(开始有多少电子邮件,如偏移量),并且都不会更改结果集计数。当然,当我将select语句从'messageInfo.mid'更改为'mid'时,numMid/startMid'work'又一次,但是他的isRead过滤功能不再有效。我知道还有其他的解决方案,我设置了numMid = 50000或者沿着这些线,但YQL开始有点慢,我只能想象这会显着减慢速度。

所以问题是,有没有人这样做? YQL刚刚坏了/没有维护,还是我做错了什么?

谢谢!

编辑:显然这个'47'显示是从我有的前50个电子邮件,其中3个被读取。我还没有弄清楚如何“欺骗”YQL以允许我覆盖这个限制。

回答

0

有点晚了,但我想我有你的问题的答案。

除了numInfo查询参数外,您的查询是查询几乎是正确的。请尝试更改查询

SELECT * FROM ymail.messages WHERE numMid = 75 AND startMid = 0和numInfo = 75 AND messageInfo.flags.isRead = 0

通知的numInfo=75 。这应该会让你看到最近的75条未读消息。要了解更多有关不同的查询参数参见官方文档here

编辑1个
表ymail.messages应该默认返回未读邮件。有一个GroupBy参数,你应该使用,如果你想获得未读的消息。查找文档here