【问题标题】:Why does this Yahoo weather API query not work?为什么这个 Yahoo 天气 API 查询不起作用?
【发布时间】:2015-09-20 01:04:25
【问题描述】:

从渥太华获取预报的查询不起作用:

SELECT * FROM weather.forecast WHERE woeid IN (SELECT woeid FROM geo.places WHERE text="Ottawa, Canada" limit 1)

结果:

"query": {
  "count": 1,
  "created": "2015-07-02T13:06:45Z",
  "lang": "en-US",
  "results": {
   "channel": {
    "title": "Yahoo! Weather - Error",
    "description": "Yahoo! Weather Error",
    "item": {
     "title": "City not found",
     "description": "\nInvalid Input /forecastrss?w=91982014\n"
    }
   }
  }
 }

自行执行,子查询得到正确结果:

SELECT woeid FROM geo.places WHERE text="Ottawa, Canada" limit 1

结果:

"query": {
  "count": 1,
  "created": "2015-07-02T13:00:47Z",
  "lang": "en-US",
  "results": {
   "place": {
    "woeid": "91982014"
   }
  }
 }

这适用于我尝试过的所有其他城市,当我省略“限制 1”时,它也适用于渥太华,但返回的结果太多。是我做错了什么还是 API 有问题?

【问题讨论】:

    标签: api yahoo weather


    【解决方案1】:

    我认为问题在于,对于渥太华,有多个结果(多个 WOEID),并且并非所有这些 WOEID 在 weather.forecast 表中都有相应的条目。我认为是因为其中一些条目的水平与我们预测的水平不同。

    查询SELECT woeid FROM geo.places WHERE text="Ottawa, Canada" 产生以下结果:

    "results": {
     "place": [
      {
       "woeid": "91982014"
      },
      {
       "woeid": "29375164"
      },
      {
       "woeid": "12483153"
      }
     ]
    }
    

    如果您修改查询以包含地点的类型SELECT woeid, placeTypeName.content FROM geo.places WHERE text="Ottawa, Canada",您可以看到结果包括城镇、县/区和岛,而城镇是结果中的第一项:

    "results": {
     "place": [
      {
       "woeid": "91982014",
       "placeTypeName": "Town"
      },
      {
       "woeid": "29375164",
       "placeTypeName": "County/District"
      },
      {
       "woeid": "12483153",
       "placeTypeName": "Island"
      }
     ]
    }
    

    在返回太多结果 SELECT * FROM weather.forecast WHERE woeid IN (SELECT woeid FROM geo.places WHERE text="Ottawa, Canada") 的完整查询的结果中,您可以看到一个名为 diagnostics 的部分,其中包含一个名为 url 的数组,该数组提供了由于您的查询:

    http://weather.yahooapis.com/forecastrss?w=12483153
    http://weather.yahooapis.com/forecastrss?w=29375164
    http://weather.yahooapis.com/forecastrss?w=91982014
    

    并且 91982014 的结果是一个错误:

    您可以从结果SELECT * FROM weather.forecast WHERE woeid IN (SELECT woeid FROM geo.places WHERE text="Ottawa, Canada") AND title NOT LIKE "%Error%" 中删除错误情况,这仍然会给出两个结果。

    看来你真正想做的是意识到加拿大有三个地方的名字是“渥太华”:安大略省的首府渥太华,县/区安大略省的渥太华,以及努纳武特境内称为渥太华群岛的一组岛屿。因此,您的查询需要更加具体。

    SELECT * FROM weather.forecast WHERE woeid IN (SELECT woeid FROM geo.places WHERE text="Ottawa, Ontario, Canada") AND title NOT LIKE "%Error%"

    感觉很笨拙,但它给出了一个单一的结果。

    【讨论】:

    • 感谢您的详细解答!更具体的问题是我只能从另一个 API 获取城市和国家/地区名称,但根据您的建议,我可以获得一个可行的解决方案。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多