2012-10-24 132 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