J'essaie d'écrire une requête qui compte le nombre de connexions bidirectionnelles (fortes) entre les utilisateurs qui représentent les nœuds dans le graphique.Comment compter le nombre de connexions bidirectionnelles communes dans le graphique
Pour tester la requête que j'ai créé l'exemple suivant
qui est stocké dans la table monthly_connections_test:
calling_party, called_party, link_strength
z1 z2 1,0000000
z1 z3 1,0000000
z3 z1 1,0000000
z1 z4 1,0000000
z1 z5 1,0000000
z5 z1 1,0000000
z2 z4 1,0000000
z2 z5 1,0000000
z5 z2 1,0000000
z2 z7 1,0000000
z7 z2 1,0000000
z4 z7 1,0000000
z7 z4 1,0000000
z2 z1 1,0000000
La requête suivante retourne 2 pour les connexions fortes entre z1 et z2 au lieu de 1:
SELECT user1, user2, 0 AS calling_calling, 0 AS calling_called, 0 AS called_calling, 0 AS called_called, COUNT(*) AS both_directions
FROM (SELECT monthly_connections_test.calling_party AS user1, monthly_connections_test_1.calling_party AS user2
FROM monthly_connections_test INNER JOIN
monthly_connections_test AS monthly_connections_test_1 ON
monthly_connections_test.called_party = monthly_connections_test_1.called_party AND
monthly_connections_test.calling_party < monthly_connections_test_1.calling_party) t1
INNER JOIN monthly_connections_test AS monthly_connections_test_2 ON
t1.user2 = monthly_connections_test_2.called_party
AND t1.user2 < monthly_connections_test_2.calling_party
GROUP BY t1.user1, t1.user2
Les résultats de l'exemple sont les suivants:
z1 z2 0 0 0 0 2
z2 z3 0 0 0 0 3
z2 z4 0 0 0 0 1
z1 z5 0 0 0 0 3
z2 z5 0 0 0 0 3
z3 z5 0 0 0 0 2
z1 z7 0 0 0 0 4
z2 z7 0 0 0 0 1
z5 z7 0 0 0 0 1
Est-ce que quelqu'un sait comment modifier la requête afin de retourner le nombre de voisins communs qui sont connectés dans les deux sens (dans cet exemple la bonne valeur pour z1, z2 est 1 comme z5 est connecté à la fois z1 et z2 dans les deux sens)?
Le problème est, je suppose que dans la partie
INNER JOIN monthly_connections_test AS monthly_connections_test_2 ON
t1.user2 = monthly_connections_test_2.called_party
AND t1.user2 < monthly_connections_test_2.calling_party
Le résultat correct doit être le suivant:
z1 z2 0 0 0 0 1
z2 z3 0 0 0 0 1
z2 z4 0 0 0 0 1
z1 z5 0 0 0 0 1
z2 z5 0 0 0 0 1
z3 z5 0 0 0 0 1
z1 z7 0 0 0 0 1
z2 z7 0 0 0 0 0
z5 z7 0 0 0 0 1
La condition de jointure doit être formulé de telle manière que chaque connexion est compté une seule fois (les connexions précédemment incluses doivent être exclues à ce stade) mais n'ont pas trouvé la solution.
P.S. Comme la table originale se compose de 24M enregistrements, la requête doit être écrite de telle sorte qu'elle renvoie des résultats dans le délai acceptable. Essayer d'écrire la requête avec plusieurs sélections au début, il a fallu trop de temps pour exécuter.
Si vous publiez un exemple de bonne paire d'entrées-sorties, il serait plus facile pour moi et les autres utilisateurs de comprendre ce qui est éded à être fait. En ce moment je comprends que vous voulez compter les liens bidirectionnels, mais la requête pour cela est simple comme l'enfer, beaucoup plus simple que ce que vous avez écrit, alors maintenant je pense que j'ai quelque chose de mal. – AlexanderMP