【问题标题】:Facebook fql search page with strpos doesnt work?使用 strpos 的 Facebook fql 搜索页面不起作用?
【发布时间】:2011-11-13 05:11:57
【问题描述】:

为什么要查询:

SELECT name, page_id from page WHERE strpos(lower(name),lower('coca')) >= 0

返回此错误

"error_code": 604, "error_msg": "您的语句不可索引。 WHERE 子句必须包含一个可索引的列。这样的列是 在链接的表格中标有 * http://developers.facebook.com/docs/reference/fql"

然而在 Fql 文档中是这样写的: page_id & name 字段是可索引的

为什么这个查询有效?我知道那不在页表上,但是

SELECT name
FROM user
WHERE uid IN (
    SELECT uid2
    FROM friend
    WHERE uid1=me()
)
AND strpos(lower(name),"jo") >=0

来源:http://www.masteringapi.com/tutorials/facebook-fql-how-to-search-partial-strings-similar-to-mysql-like-operator/27/

【问题讨论】:

    标签: php facebook-fql facebook-page


    【解决方案1】:

    在 WHERE 子句中使用 strposlower 运算符使它们不可索引。

    在上面的例子中:

    SELECT name
    FROM user
    WHERE uid IN (
        SELECT uid2
        FROM friend
        WHERE uid1=me()
    )
    AND strpos(lower(name),"jo") >=0
    

    之所以有效,是因为您使用了可索引字段 uid。 您可以使用 strposlower 对您已经拥有的可索引字段的某些数据子集。

    在您的示例中,您没有可索引字段,因此显示错误。

    您可以像这样使用 Graph API 获得相同的结果:

    https://graph.facebook.com/search?q=coca&type=page
    

    【讨论】:

    • 我知道,但我想像 SQL 中的运算符 LIKE %var% 一样使用 strpos。您能给我看一个 FQL 中的页表示例吗?
    【解决方案2】:

    您不能在 WHERE 子句中使用 FQL 函数。这样做意味着数据库必须对表中的每一行进行计算,而不是使用索引,在 Facebook 的情况下,索引是一个非常大的数据库,要遍历每一行......

    【讨论】:

      【解决方案3】:

      这些字段是可索引的,但您正在搜索字段的派生 - 每次运行查询时都会计算 lower() 函数的值,因此不会被索引。您可能可以通过添加另一个在原始字段上操作的子句来欺骗 FB 允许它:

      WHERE strpos(lower(name), lower('coca')) >= 0 OR (name < 0)
                                                   ^^^^^^^^^^^^^
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        • 2017-01-04
        • 2022-07-21
        • 1970-01-01
        相关资源
        最近更新 更多