在选择查询中包含其他字段

时间:2011-12-26 00:23:20

标签: php yql

我正在使用YQL来获取Feed列表,如下所示:

SELECT title, link, pubDate FROM rss
    WHERE url IN ('.implode("','", array_values($urls)).')

$urls包含Feed网址:

$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(值)对应的其他字段?基本上我需要一个字段来告诉我该项目来自哪个网站,例如deliciouslastfm等。

对于lastfm,我可以strpos查看$item['url']中是否存在“last.fm”字符串,但是有了美味的链接,这是不可能的:(


3 个答案:

答案 0 :(得分:1)

您不能简单地将URL添加到字段列表中吗?或者您正在寻找解析URL的功能吗?

选择标题,链接,发布日期,URL FROM rss

我错过了为什么以上不起作用?

答案 1 :(得分:1)

由于YQL不是SQL,并且只对其查询使用SQL的语法,因此SELECT中无法使用url WHERE关键字(在您的情况下为SELECT}条款。 url只能使用$urls关键字访问xml文件的字段。 YQL将为您解析它并返回所需的字段。 并且因为有许多不同的rss标准,并不是每个标准都强制Feed包含自己的url,因此无法在feed中选择将在每种情况下返回url的字段。

我认为,您唯一的机会是遍历{{1}}数组并对每个Feed执行一次查询。只有这样,您才能保持Feed-url与此Feed项目之间的关系。

答案 2 :(得分:1)

  

我得到一个带有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 Demo

您可以使用*查找所有字段,这是我发现source字段的方式:

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

YQL Query Demo

我认为这应该回答你的问题。要减少传输的数据量,您也可以只选择源的url属性,如下所示:

SELECT title, link, pubDate, source.url FROM rss
    ...

另请参阅Using YQL to load and convert RSS feeds really, really fastHow to use YQL to merge 2 RSS feeds sorted by pubDate?


以下是对YQL语法的较早评论:

请注意,implode("','", array_values($urls))会使您的YQL语法无效:

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

您在开头和结尾看到缺少的单引号?添加它们:

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

你应该没事。至少你应该少一个错误。