Включить дополнительное поле в запрос на выборку - PullRequest
5 голосов
/ 26 декабря 2011

Я использую 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',
  ...
);

И я получаю массив элементов с полями title / link / pubdate.Помимо поля "ссылка", я не получаю никакой информации, которая могла бы сказать мне, откуда поступил элемент.

Как включить в поле array_keys($urls) дополнительное поле, соответствующее URL (значению)?В основном мне нужно поле, которое сообщает мне, с какого сайта пришел элемент, например delicious, lastfm и т. Д.

Для lastfm я могу проверить с помощью strpos, является ли строка last.fmприсутствует в $item['url'], но с восхитительными ссылками это невозможно: (


Ответы [ 3 ]

1 голос
/ 26 декабря 2011

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

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

1 голос
/ 26 декабря 2011

И я получаю массив элементов с полями title / link / pubdate. Помимо поля "ссылка", я не получаю никакой информации, которая могла бы сказать мне, откуда поступил элемент.

Чтобы получить информацию о происхождении каждого элемента, добавьте поле 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-каналов, отсортированных по pubDate? .


Ниже приведен более старый комментарий к синтаксису YQL:

Обратите внимание, что implode("','", array_values($urls)) оставит ваш YQL с неверным синтаксисом:

... IN (urlA ',' urlB ',' urlC)

Вы видите пропущенные одинарные кавычки в начале и в конце? Добавьте их:

"'".implode("','", $urls)."'"

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

1 голос
/ 26 декабря 2011

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

ВЫБРАТЬ заголовок, ссылку, дату публикации, URL ОТ rss

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

...