2015-07-02 7 views
-1

Этот запрос, чтобы получить прогноз Оттаве не работает:Почему этот запрос API Yahoo Yahoo не работает?

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 по вине?

ответ

0

Я думаю, проблема в том, что для Оттавы существует несколько результатов (несколько 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" 
    } 
] 
} 

в результатах полного запроса, который возвращает слишком много результатов , вы можете увидеть раздел под названием diagnostics, который имеет п массив называется url, что дает URL-адрес погода API, которые были вызваны в результате запроса:

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%"

чувствует kludgey, но это дает один результат.

+0

Благодарим за подробный ответ! Проблема с более конкретным заключается в том, что я получаю только название города и страны от другого API, но с вашим советом я могу получить рабочее решение. Еще раз спасибо. – user923487