4

我目前正在编写一个 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 个限制。

4

1 回答 1

0

有点晚了,但我想我已经回答了你的问题。

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

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

注意numInfo=75. 这应该会为您提供最后 75 条未读消息。要阅读有关不同查询参数的更多信息,请参阅此处的官方文档

编辑 1
默认情况下,表 ymail.messages 应返回未读消息。GroupBy如果您想获取未读消息,您应该使用一个参数。在此处查找文档

于 2013-01-03T19:15:51.417 回答