J'ai une table comme celle ci-dessous: 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 Réponses :
Peut-être que quelque chose de plus simple pourrait fonctionner plus rapidement, par exemple
Le suivi_id code> n'est probablement jamais identique que leader_id code> de la même ligne, donc où suivi_id = leader_id code> retourne probablement 0 rangées.
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 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. P> 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. p> 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 P> p> comme code> pour rejoindre vos tables.
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.
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
existe parfois est très efficace: Cette requête ne reviendra qu'une seule fois.
Voir le Démo .
Résultats: P> | id1 | id2 |
| --- | --- |
| 1 | 2 |
Tout d'abord, vous pouvez optimiser cette requête avec index: L'index suivant devrait aider: Je préférerais écrire cela comme La dernière condition garantit que vous avez les deux directions dans les données. P> p> adeptes (suivi_id, nom_id, statut) p>. P>. existe code>. Vous pouvez également essayer l'agrégation: p>
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 .. code> 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écutershow créer une table .. code> et postez son résultat aussi bienIndice: Faire des index sur
Statut Code> Colonne d'abord ..Vous pouvez faire la clé primaire une combinaison de
suivi_id code> etleader_id code>. Vous n'avez pas besoin duID code> 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.