2010-11-23 29 views
2

J'ai réussi à avoir une requête pour obtenir tous les amis et amis d'amis d'un utilisateur particulier. J'ai une table d'utilisateurs et une table de jointure d'amitiés. Pour simplifier, disons simplement que la table des utilisateurs n'a qu'une clé primaire. La table des amitiés a les colonnes user_id et friend_id. La requête est la suivante:Sphinx indexer requête personnalisée pour 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 est l'identifiant de l'utilisateur que je souhaite obtenir tous les amis et les amis des amis.

Cette requête fonctionne très bien mais je voudrais la convertir en une requête utilisable par sql_attr_multi de sphinx. J'ai essayé de le placer directement comme ceci:

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 

mais cela a évidemment échoué.

Comment rendre cette requête utilisable par l'indexeur de sphinx?

Merci d'avance pour tout ce qui va me diriger dans la bonne direction.

Répondre

2

Je ne sais pas assez sur votre structure de données pour dire que cela 100% le travail, mais je vois un problème évident:

WHERE utilisateurs . id = FoF . friend_id AND amis . friend_id = FoF . user_id AND amis . id_utilisateur = $id

La dernière partie, WHERE id_utilisateur = $ id est erronée. Cette syntaxe fonctionne lors de l'ajout d'un attribut sql_query_info à un index sphinx, mais pas à sql_attr_multi.

Votre requête pour le sql_attr_multi devrait sélectionner l'id comme la première colonne qui correspond à l'id de document dans votre sql_query principal.

La deuxième colonne de sql_attr_multi est la colonne que vous souhaitez regrouper dans l'attr.

+0

Merci pour le conseil, mais je ne sais toujours pas comment s'y prendre. Cela signifie que j'ai besoin de créer une requête différente? –

+1

Non. Votre requête principale pour récupérer les données de l'index (sql_query) doit être un identifiant. Cet identifiant doit correspondre à la première colonne sélectionnée dans votre requête sql_attr_multi. La seconde colonne que vous sélectionnez dans votre requête sql_attr_multi est celle que vous voulez réellement rechercher des valeurs. Vous n'utilisez pas WHERE id = $ id dans sql_attr_multi (la sélection de cette colonne d'id réalise la même chose) – Jon

+0

Après des heures d'essayer de comprendre cela, je suis toujours à un barrage routier. J'ai vu d'autres requêtes utilisant des jointures? Comme je ne suis pas expert dans les requêtes sql, est-il possible que ma requête ait une version "joins"? –