我目前正在编写一个 JAVA 应用程序,我需要在其中访问来自用户 Yahoo 电子邮件的以下信息(以显示给他们)。YQL 看起来像是一种“快速简便的方法”,但事实证明它更难。我运行的所有测试都在这里完成:http: //developer.yahoo.com/yql/console/我可以使用我的 webapp/oauth 复制相同的结果。
- 至
- 发件人电子邮件
- 来自名字
- 主题
- 信息
- 日期
- 中
我无法将这全部用于 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'
但是,这会导致“null”。为了调试这个我只是运行子选择并想出这个:
SELECT folder.folderInfo.fid, mid
FROM ymail.messages
WHERE numMid=10
AND startMid=0
AND messageInfo.flags.isRead=0
此查询返回 10,不幸的是,经过进一步审查,它没有过滤掉已读 VS 未读。经过一番玩弄之后,我将 select 语句更改为以下查询:
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,并且都没有更改结果集计数。当然,当我将 select 语句从“messageInfo.mid”更改回“mid”时,numMid / startMid 再次“工作”,但是从他的 isRead 过滤不再起作用。我知道还有其他解决方案,我设置 numMid=50000 或类似的东西,但是 YQL 一开始有点慢,我只能想象这会显着减慢它。
那么问题来了,有人做过吗?YQL 只是坏了/没有维护还是我做错了什么?
谢谢!
编辑:显然这个“47”来自我拥有的前 50 封电子邮件,其中 3 封已阅读。我还没有弄清楚如何“欺骗” YQL 以允许我覆盖这 50 个限制。