Включить дополнительное поле в запрос выбора


Я использую 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'], но с восхитительными ссылками это невозможно:(


 5
Author: Laurel, 2011-12-26

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>

В YQL Демо-версия.

Вы можете искать все поля с помощью *, вот как я узнал о поле source:

SELECT * FROM rss
    WHERE url IN ('http://feeds.delicious.com/v2/rss/geek', 'http://feeds.delicious.com/v2/rss/foo')

Демонстрация запроса YQL

Я думаю, что это должно ответить на ваш вопрос. Чтобы уменьшить объем передаваемых данных, вы также можете выбрать только атрибут 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)."'"

И с тобой все должно быть в порядке. По крайней мере, у вас должно быть на одну ошибку меньше.

 1
Author: hakre, 2017-05-23 12:23:52

Не можете ли вы просто добавить URL-адрес в свой список полей? Или вы ищете функцию для анализа URL-адреса?

ВЫБЕРИТЕ заголовок, ссылку, дату публикации, URL-АДРЕС ИЗ rss

Я не понимаю, почему вышеперечисленное не сработает?

 1
Author: Sparky, 2011-12-26 01:00:21

Поскольку YQL не является SQL и использует синтаксис SQL только для своих запросов, нет никаких шансов SELECT ключевое слово (в вашем случае url), используемое в предложении WHERE. SELECT может получить доступ только к полям xml-файла, заданным с помощью ключевого слова url. YQL проанализирует его для вас и вернет нужные поля. И поскольку существует множество различных стандартов rss, и не каждый стандарт заставляет канал содержать свой собственный URL-адрес, невозможно выбрать поле в канале, которое будет возвращать URL-адрес в каждом дело.

Я думаю, что ваш единственный шанс будет состоять в том, чтобы выполнить итерацию по массиву $urls и выполнить один запрос на канал. Только так вы сможете сохранить связь между URL-адресом канала и элементами этого канала.

 1
Author: Corubba, 2011-12-26 02:13:16