2014-07-26 2 views
0

je suit: 3 tables Users, Friendship & LocationSQL JOIN de de 3 Tableau basé sur deux colonnes

J'ai besoin d'écrire la requête où les données sont extraites de toutes les 3 tables basées sur userid.

enter image description here

enter image description here

Je pense astuce est ici que vous devez extraire des données basées sur deux colonnes de la table d'amitié c.-à-userid et friendID (si les deux sont chaque ami d'autres) et en fonction des amis de quel utilisateur liste dont vous avez besoin, vous devez tirer le nom de son ami, email et l'emplacement en conséquence.

J'ai écrit des requêtes en utilisant des jointures, mais je ne peux pas obtenir ce dont j'ai besoin comme mentionné ci-dessus.

Toute aide serait vraiment appréciée.

+0

hey est votre question est la même que la mienne? : http://stackoverflow.com/questions/25015124/datatables-searching-at-server-side-php-mysql ..vous avez une solution? – user3209031

Répondre

1
select f.id as friendshipid, 
     f.userid, 
     f.friendid, 
     u.name, 
     u.email, 
     l.location 
    from (select id, userid, friendid 
      from friendship 
     union all 
     select id, friendid, userid 
      from friendship) f 
    left join location l 
    on f.friendid = l.userid 
    left join users u 
    on f.friendid = u.id 
where f.userid = 2 

Vous pouvez voir un test de violon ici: http://sqlfiddle.com/#!6/8eba4/13/0

je une vue en ligne qui renverse la table des amitiés et se connecte à la table elle-même avec un syndicat, de cette façon la requête voit des amitiés dans les deux sens , puisqu'ils sont stockés dans une seule direction.

+0

Merci beaucoup pour votre réponse rapide Brian. Je suis allé si loin que ça ne marche malheureusement pas pour moi. Si je alimente userid = 1 ci-dessus, la requête fonctionne parfaitement. si je nourris userid = 2 rien n'est retourné. –

+0

@ Mr.Mubi Je crois que je l'ai réparé, s'il vous plaît voir nouveau violon et sql. –

+0

@Brain encore une fois merci, j'ai déjà essayé cela. Il donnera le même résultat pour userid = 1 et 2. Donc, fondamentalement, la première requête fonctionne bien pour userid = 1 et la deuxième requête fonctionne pour userid = 2. J'ai besoin de requête qui fonctionne bien pour les deux. ou peut-être il y a une limitation et un besoin de changer la structure de DB. Mais je me demandais s'il y avait une solution comment la liste d'amis est enregistrée dans la base de données. Je ne me sens pas approprié d'avoir 2 disques pour une amitié. comme si l'utilisateur jim envoie une requête à jay et que les deux sont amis, il devrait être sauvegardé dans un seul enregistrement? Des pensées? –

0

Si vous ne tirez qu'un seul ID à la fois, vous pouvez le faire sans faire de sous-requêtes.

SELECT friendship.id FriendshipID 
, @SearchedID UserID 
, users.id FriendID 
, users.name Name 
, users.email Email 
, location.location Location 
FROM friendship 
INNER JOIN users 
    ON friendship.userid = users.id 
    OR friendship.friendid = users.id 
INNER JOIN location 
    ON users.id = location.userid 
WHERE 
    users.id <> @SearchedID 
    AND (friendship.userid = @SearchedID OR friendship.friendid = @SearchedID); 
Questions connexes