2010-11-23 105 views
2

我设法有一个查询获取特定用户的朋友的所有朋友和朋友。我有一个用户表和一个友谊连接表。为了简单起见,我们只需说用户表只有一个主键。友谊表具有user_id和friend_id列。查询如下:Sphinx索引器自定义查询sql_attr_multi

"SELECT DISTINCT friends.user_id, friends.friend_id, users.* 

    FROM FRIENDSHIPS friends, USERS 

    WHERE USERS.id = friends.friend_id AND friends.user_id = #{u.id} 

    UNION 

    SELECT DISTINCT fof.user_id, fof.friend_id, users.* 

    FROM FRIENDSHIPS friends, FRIENDSHIPS fof, USERS 

    WHERE USERS.id = fof.friend_id AND friends.friend_id = fof.user_id AND friends.user_id = #{u.id}" 

u.id是我希望得到朋友的所有朋友和朋友的用户的id。

此查询工作得很好,但我想将其转换为sphinx的sql_attr_multi可用的查询。我试图直接把它像这样:

sql_attr_multi = uint fwfof from query; \ 
    SELECT DISTINCT `friends`.`user_id`, `friends`.`friend_id`, `users`.`id` \ 
    FROM `friendships` friends, `users` \ 
    WHERE `users`.`id` = `friends`.`friend_id` AND `friends`.`user_id` = $id \ 
    UNION \ 
    SELECT DISTINCT `fof`.`user_id`, `fof`.`friend_id`, `users`.`id` \ 
    FROM `friendships` `friends`, `friendships` `fof`, `users` \ 
    WHERE `users`.`id` = `fof`.`friend_id` AND `friends`.`friend_id` = `fof`.`user_id` AND `friends`.`user_id` = $id 

但这显然失败。

如何让这个查询可用于sphinx的索引器?

预先感谢任何能够指引我正确方向的事情。

回答

2

我不知道有足够的了解你的数据结构,这不能不说会100%的工作,但我看到一个明显的问题:

WHERE用户. ID = FOF . friend_id AND朋友. friend_id = FOF . USER_ID AND朋友. user_id = $id

最后一部分WHERE user_id = $ id是错误的。将sql_query_info属性添加到sphinx索引时,该语法可用,但不适用于sql_attr_multi。

您对sql_attr_multi的查询应该选择id作为匹配主sql_query中文档ID的第一列。

sql_attr_multi的第二列是要在attr中组合在一起的列。

+0

感谢您的提示,但我仍然不确定如何去做这件事。这意味着我需要创建一个不同的查询? – 2010-11-23 21:13:55