Включить дополнительное поле в запрос выбора
Я использую YQL для получения списка каналов, например:
SELECT title, link, pubDate FROM rss
WHERE url IN ('.implode("','", array_values($urls)).')
$urls
содержит URL-адреса каналов:
$urls = array(
'delicious' => 'http://feeds.delicious.com/v2/rss/foo',
'delicious' => 'http://feeds.delicious.com/v2/rss/anotherfoo',
'lastfm' => 'http://ws.audioscrobbler.com/1.0/user/foo/recenttracks.rss',
...
);
И я получаю массив элементов с полями заголовка/ссылки / даты публикации. Помимо поля "ссылка", я не получаю никакой информации, которая могла бы подсказать мне, откуда взялся товар.
Как я могу включить дополнительное поле из array_keys($urls)
, соответствующее URL (значению)? В принципе, мне нужно поле, которое сообщает мне, с какого сайта взят товар, напримерdelicious
, lastfm
и т.д.
Для lastfm я мог бы проверить с помощью strpos
, если "last.fm "строка присутствует в $item['url']
, но с восхитительными ссылками это невозможно:(
3 answers
И я получаю массив элементов с полями заголовка/ссылки / даты публикации. Кроме поля "ссылка", я не получаю никакой информации, которая могла бы подсказать мне, откуда взялся товар.
Чтобы получить информацию о том, откуда берется каждый элемент, добавьте поле source
:
SELECT title, link, pubDate, source FROM rss
...
Результат будет содержать элемент source
в каждой записи, который имеет атрибут url
, содержащий URL-адрес, с которого был извлечен элемент:
<results>
<item>
<title>Git Immersion - Brought to you by EdgeCase</title>
<pubDate>Wed, 21 Dec 2011 22:15:44 +0000</pubDate>
<link>http://gitimmersion.com/</link>
<source url="http://feeds.delicious.com/v2/rss/geek">geek's links</source>
</item>
Вы можете искать все поля с помощью *
, вот как я узнал о поле source
:
SELECT * FROM rss
WHERE url IN ('http://feeds.delicious.com/v2/rss/geek', 'http://feeds.delicious.com/v2/rss/foo')
Я думаю, что это должно ответить на ваш вопрос. Чтобы уменьшить объем передаваемых данных, вы также можете выбрать только атрибут URL источника следующим образом:
SELECT title, link, pubDate, source.url FROM rss
...
Смотрите также Использование YQL для загрузки и преобразования RSS-каналов очень, очень быстро и Как использовать YQL для объединения 2 RSS-каналов, отсортированных по Дата публикации?.
Ниже приведен более старый комментарий к синтаксису YQL:
Пожалуйста, обратите внимание, что implode("','", array_values($urls))
оставит ваш YQL в недопустимом синтаксисе:
... В(URLA','URLB','URLC)
Вы видите отсутствующие одинарные кавычки в начале и в конце? Добавьте их:
"'".implode("','", $urls)."'"
И с тобой все должно быть в порядке. По крайней мере, у вас должно быть на одну ошибку меньше.
Не можете ли вы просто добавить URL-адрес в свой список полей? Или вы ищете функцию для анализа URL-адреса?
ВЫБЕРИТЕ заголовок, ссылку, дату публикации, URL-АДРЕС ИЗ rss
Я не понимаю, почему вышеперечисленное не сработает?
Поскольку YQL не является SQL и использует синтаксис SQL только для своих запросов, нет никаких шансов SELECT
ключевое слово (в вашем случае url
), используемое в предложении WHERE
. SELECT
может получить доступ только к полям xml-файла, заданным с помощью ключевого слова url
. YQL проанализирует его для вас и вернет нужные поля.
И поскольку существует множество различных стандартов rss, и не каждый стандарт заставляет канал содержать свой собственный URL-адрес, невозможно выбрать поле в канале, которое будет возвращать URL-адрес в каждом дело.
Я думаю, что ваш единственный шанс будет состоять в том, чтобы выполнить итерацию по массиву $urls
и выполнить один запрос на канал. Только так вы сможете сохранить связь между URL-адресом канала и элементами этого канала.