0
votes

La jointure de table ne fonctionne pas car elle est censée dans MySQL

J'ai 2 tables, le premier est users_tables code> et le second est amis_table code>.

users_table code> contient les informations sur un utilisateur, y compris interdit code> colonne et le amis_table code> est l'amitié entre les utilisateurs. p>

Les deux tables ont la colonne user_id code> donc ce que je veux, c'est de récupérer le nombre d'amis pour un utilisateur spécifique basé sur des conditions des deux tables. Les conditions sont sur user_id code> et bannied code>. Je veux que le nombre d'amis excluions les utilisateurs interdits, mais je reçois toujours le nombre total d'amis, même si un ami utilisateur est banni. Aidez-moi s'il vous plaît, voici mes questions qui fonctionnent simultanément pour récupérer les amis: p> xxx pré>

edit forte> La structure "users_table": p> xxx pré>

la structure "Friends_Table": P>

friendship_id | user_id | friend_id | friendship_timestamp
10                20         30             1534342490
9                 20         22             1533484062
16                32         20             1541619611


5 commentaires

Query1 va bien pour moi ... Si vous nous donnez la structure de la table, nous vous dirons ce qui ne va pas.


@Xraysensei j'ai ajouté la structure des tables


Est-ce que vos amis sont enregistrés chaque amitié de manière bidirectionnelle? I.e. User1 et User2 ont une fidusique, il existe donc deux enregistrements: l'un où user1 est l'user_id et user2 est le ami_id et un autre enregistrement où User2 est l'user_id et user1 l'AMIDE_ID


non, ce qui se passe est que si l'utilisateur 1 ajoutez utilisateur 2 comme ami, donc dans les amis_table user_id = user1 et ami_id = user2 mais la requête pour aller chercher les amis chèques 2 fois


Ensuite, je pense que la deuxième requête de @gmbe réponse est votre meilleure option si elle correspond à vos données.


3 Réponses :


2
votes

Vous avez besoin d'un code> supplémentaire code> sur la table code> utilisateur code> pour vérifier si l'ami est banni.

Votre première requête devient: p>

SELECT * 
FROM users_table u 
LEFT JOIN friends_table f1 ON f1.friend_id = u.user_id
LEFT JOIN users_table uf1 ON uf.user_id = f1.user_id AND uf1.banned = 0
LEFT JOIN friends_table f2 ON f2.user_id = u.user_id
LEFT JOIN users_table uf2 ON uf2.user_id = f2.friend_id AND uf2.banned = 0
WHERE u.user_id = $user_id AND COALESCE(uf1.id, uf2.id) IS NOT NULL


8 commentaires

J'ai essayé votre requête, mais cela me donne toujours le nombre total d'amis et sans exclure les amis interdites par l'administrateur


@firasProgrammer: j'ai mis à jour ma réponse, s'il vous plaît vérifier


Ma requête est maintenant comme ça, et j'ai reçu une erreur $ QUERY2 = "SELECT * de users_Table U inner rejoindre friends_table f sur u.user_id = f.friend_id interne joindre user_tables uf sur uf.user_id = f.user_id et uf.banned = 0 où f.friend_id = $ user_id ";


@firasProgrammer: j'ai corrigé un type sur user_tables au lieu de users_table ... Veuillez exécuter ma requête exacte (celle que vous venez d'être montré a une différence clause)


GMB j'ai ajouté la même requête2 u posté mais qu'en est-il de Query1, que devrait-il être?


@firasProgrammer: Fait: toutes les questions sont à jour maintenant


Pouvez-vous poster s'il vous plaît Final Query1 et Final Query2 afin que nous puissions être sur la même page?


@firasProgrammer: c'est déjà fait, vous avez des versions finales de toutes les questions de ma réponse



0
votes

Votre requête n'apparaît que pour vérifier que l'utilisateur lui-même est banni. Vous devrez ajouter une autre jointure à la table des utilisateurs pour le "ami", pour vérifier leur statut également:

*** Assomption: Friend_table n'est qu'une table de liaison sans colonne "banni" < Pré> xxx


1 commentaires

J'ai ajouté la structure des tables, je liste les amis de l'utilisateur sur sa page de profil de la page de profil indiquant le nombre d'amis aussi, ce que je veux, c'est pour l'utilisateur connecté pour voir uniquement les amis non interdites



1
votes

Vous devez Joindre Tableau des utilisateurs deux fois pour déterminer si l'ami est banni. Query 1: XXX

Pour les données d'échantillon que vous avez fournies, cela donne les résultats attendus d'aucun ami à l'exception de user_id 32.

Query 2: < Pré> xxx

pour les échantillons de données que vous avez fournies, cela donne un ensemble de résultats différent car certains utilisateurs interdits ont des amis non bannis.

Démo sur Dbfiddle


16 commentaires

toujours pas de chance, essayé à la fois dans les requêtes en même temps, mais je reçois toujours le nombre total d'amis


@firasProgrammer était la deuxième requête que vous avez essayée comme celle que je viens d'ajouter à ma réponse?


Oui, je l'ai retracé à nouveau et j'ai toujours le même nombre d'amis totaux, je devrais avoir 1, au lieu de cela, je reçois 3 à partir desquels 2 sont interdits


@firasProgrammer à partir de votre description, une de ces questions devrait fonctionner. vous aurez probablement besoin de fournir des exemples de données pour que cela résolue


Qu'entendez-vous que vous voulez dire des données d'échantillons fournis? Je devrais mettre des noms dans la table tu veux dire?


@firasProgrammer Oui, montrez-nous quelques échantillons de lignes de votre table, avec la sortie attendue de votre requête sur ces rangées


ok y a-t-il de toute façon quand même je peux partager sans taper un par un? comme obtenir le SQL ou quelque chose?


@firasProgrammer Si vous pouviez simplement copier et coller les résultats de ces requêtes dans la question qui serait très utile.


Nick j'ai ajouté des exemples d'enregistrements


@firasProgrammer ma deuxième requête semble donner le résultat attendu. Voir le lien de démonstration dans ma réponse modifiée.


ok je vois qu'il donne le bon résultat, alors pouvez-vous s'il vous plaît poster Final Query1 et Quer2?


@firasProgrammer J'ai posté la dernière requête1 et Query2. J'ai également mis à jour la démo avec la dernière requête2 aussi.


Ok Nick, quand j'ai essayé exactement vos questions, je reçois 2 amis, je devrais recevoir 1 mais quand j'ai modifié vos requêtes à cela, j'ai reçu le bon résultat qui est 1 $ Query1 = "Sélectionnez * à partir de users_table u Rejoignez des amis_Table F sur f. user_id = u.user_id joindre utilisateur u2 u2 sur u2.user_id = f.friend_id où u.user_id = $ user_id et u2.banned = 0 ";


$ Query2 = "Sélectionnez * à partir de users_table u Rejoignez des amis_Table F sur f.user_id = u.user_id joindre utilisateur_table u2 sur u2.user_id = f.user_id where $ user_id et u2.banned = 0";


Comment est votre requête1 différente de la mienne?


C'est différent après où