0
votes

Ma requête SQL pour obtenir des adeptes mutuelles / amis

J'ai une table comme celle ci-dessous: xxx pré>

de cette table, je veux revenir le suivi_id / leader_id qui sont mutuels. P>

pour les exemples 2, 1 sont mutuels dans cette table. Pour y parvenir, j'utilise le SQL P>

SELECT r.follower_id RF
     , r.leader_id   RL
     , l.follower_id LF
     , l.leader_id   LL
  FROM followers r
  JOIN followers l
    ON l.follower_id = r.leader_id 
   AND l.leader_id = r.follower_id 
 WHERE r.status = 'approved'
   AND l.status = 'approved'; 


5 commentaires

Pouvez-vous ajouter des résultats attendus? C'est une relation parent-enfant?


Que voulez-vous dire par "prend plus de temps"? Combien de temps cette requête prend-elle? Exécutez également expliquer .. sur votre requête actuelle et postez les résultats informatiques ici. En outre, toutes les exigences liées à l'optimisation doivent également mentionner les détails de l'indexation sur la table (le cas échéant). Exécuter show créer une table .. et postez son résultat aussi bien


Indice: Faire des index sur Statut Colonne d'abord ..


Vous pouvez faire la clé primaire une combinaison de suivi_id et leader_id . Vous n'avez pas besoin du ID ici, car vous obtiendrez une combinaison unique pour chaque ligne sur les identifiants suivants / chefs.


Vous pouvez concaténer les deux identifiants dans une valeur séparée par une virgule dans l'ordre croissant (cas, concat_ws), groupe par cette valeur combinée et limiter le résultat à ceux qui ont un compte> 1 ... Vous devez vérifier si cela fonctionne mieux avec un plus grand Échantillon de données cependant.


5 Réponses :


0
votes

Peut-être que quelque chose de plus simple pourrait fonctionner plus rapidement, par exemple xxx


1 commentaires

Le suivi_id n'est probablement jamais identique que leader_id de la même ligne, donc où suivi_id = leader_id retourne probablement 0 rangées.



0
votes

Vous rejoignez toute la table avec la même table. Cela n'a aucun sens. Essayez la jointure intérieure afin de vous donner la coupe où les dirigeants ont les mêmes partisans ou les suiveurs les mêmes dirigeants. De plus, vous devez utiliser un alias comme pour rejoindre vos tables. XXX

Avant quelqu'un de chier ME, Ceci est un exemple de script qui vous est montré toutes les entrées de Bouth les tables. Dans ce cas, deux fois la même table.

mieux pour cela est de faire 2 tables. Créez une table de comptabilité et une table Suivre et rejoignez-les. devrait fonctionner correctement aswell et plus vite.

Si vous souhaitez que plus de méthodes joignent des tables Jetez un coup d'œil ici: https://www.w3schools.com/sql/sql_join.asp


6 commentaires

Il n'y a pas de différence entre rejoindre et rejoindre interne. Vous utilisez la même méthode de jointure que OP. La seule différence est dans la clause Where.


Oui, mais s'il a un ancien interprète / obsolète, il pourrait être que la commande de jointure soit utilisée comme une jointure extérieure gauche ou droite. Il vaut mieux appeler le nom complet de la fonction à la place de la coupe courte. C'était mon problème il y a 2 ans.


OP renvoie les résultats corrects afin que le serveur MySQL soit suffisamment mis à jour ... La question concerne la performance


Je ne peux que l'imaginer que le serveur MySQL ou le serveur Apache ait trop peu de RAM. Ce code MySQL n'est pas si long et dur, donc cela ne peut pas prendre plus de temps puis 1 sec, je suppose. Peut-être que c'est également dû à l'interface qui appelle le tout.


Il y a de nombreuses raisons pour lesquelles cette requête peut être lente: index pour exemples. Apache n'est pas impliqué du tout et le matériel n'est pas car l'OP est pointé sur une seule question, n'est-ce pas d'accord?


Bien sûr, je le fais, mais j'espère que vous conviendrez mes points aussi, XD la liste pourrait être terminée et je ne peux pas imaginer pourquoi la requête MySQL devrait être le résultat du problème.



0
votes

Votre requête produise un enregistrement en double. Cela crée également un délai pour votre connexion MySQL.

Pour éviter la duplication consiste à résoudre votre problème. P>

i Ajouter mes travaux ci-dessous, P>

RF  RL  LF  LL
2   1   1   2


0 commentaires

0
votes

existe parfois est très efficace: xxx pré>

Cette requête ne reviendra qu'une seule fois.
Voir le Démo .
Résultats: P>

| id1 | id2 |
| --- | --- |
| 1   | 2   |


0 commentaires

0
votes

Tout d'abord, vous pouvez optimiser cette requête avec index: xxx

L'index suivant devrait aider: adeptes (suivi_id, nom_id, statut) . .

Je préférerais écrire cela comme existe . Vous pouvez également essayer l'agrégation: xxx

La dernière condition garantit que vous avez les deux directions dans les données.


0 commentaires