我目前正在编写一个JAVA应用程序,需要从用户Yahoo电子邮件消息中获取以下信息(以便向他们显示)。 YQL看起来像是一种“快速简便的方法”来做到这一点,然而它证明更加困难。我在此处进行了所有测试:http://developer.yahoo.com/yql/console/ 我可以使用我的webapp / oauth重复相同的结果。
最终,这个程序可以运行!但是返回了47封电子邮件而不是10封。更有趣的是,我知道我的收件箱中有207封(未读)邮件,那为什么是47呢?我已将“numMid”(显示多少封邮件)从0到300和“startMid”(从哪开始,如偏移量一样)从0到300进行了更改,但结果集数量并没有改变。当我将选择语句从“messageInfo.mid”改回“mid”时,“numMid / startMid”再次“工作”,但是来自isRead的过滤不再起作用。我知道还有其他解决方案,比如将numMid设置为50000或类似的值,但是YQL本来就很慢,我只能想象这会显著减慢速度。
- 收件人
- 发件人电子邮件地址
- 发件人姓名
- 主题
- 消息正文
- 日期
- MID
我无法将所有内容放入一个查询调用中(即使是两个调用也有困难,虽然我没有花费太多时间研究这样的解决方案)。目前我有以下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'
然而,这将产生“null”作为结果。为了调试此问题,我只运行子查询并得出以下结果:
SELECT folder.folderInfo.fid, mid
FROM ymail.messages
WHERE numMid=10
AND startMid=0
AND messageInfo.flags.isRead=0
这个查询返回了10条结果,但是经过进一步的检查,它没有将已读和未读的结果进行筛选。在进行更多的尝试后,我将选择语句更改为以下查询:
SELECT folder.folderInfo.fid, messageInfo.mid
FROM ymail.messages
WHERE numMid=10
AND startMid=0
AND messageInfo.flags.isRead=0
最终,这个程序可以运行!但是返回了47封电子邮件而不是10封。更有趣的是,我知道我的收件箱中有207封(未读)邮件,那为什么是47呢?我已将“numMid”(显示多少封邮件)从0到300和“startMid”(从哪开始,如偏移量一样)从0到300进行了更改,但结果集数量并没有改变。当我将选择语句从“messageInfo.mid”改回“mid”时,“numMid / startMid”再次“工作”,但是来自isRead的过滤不再起作用。我知道还有其他解决方案,比如将numMid设置为50000或类似的值,但是YQL本来就很慢,我只能想象这会显著减慢速度。
问题是,有人做过这个吗? YQL是不是坏了/未维护,还是我做错了什么?
谢谢!
编辑:显然,出现的“47”是我拥有的50封电子邮件中的三封。我还没有想出如何“欺骗”YQL以允许我覆盖这个50限制。