requête MySql pour obtenir toutes les combinaisons d'éléments dans un même champ de table

StackOverflow https://stackoverflow.com/questions/4399436

Question

je voudrais reformater une table de MySql pour une utilisation dans un logiciel de mappage de noeud de réseau. Le format original est:

| ID | story | org | scribe |

et je voudrais tirer tous les noms d'org en deux tables de sortie comme ceci:

| org1 | org2 | scribe | weight of connection |

org1 et org2 viennent tous les deux du même champ dans la table d'origine, et sont liés les uns aux autres en partageant un ou plusieurs scribes. Tous les scribes ont des identifiants uniques. Et bien sûr, je ne veux pas les doublons.

Ce que je CAN faire jusqu'à présent est de tirer tous les orgs qui sont connectés à une org dans la liste en faisant un « % texte% » recherche de l'org puis excluant que org de la sortie, comme suit:

SELECT 'tabitha' as org1,
org as org2,
teller as scribe_id,
count(teller) as weight
FROM `stories`
WHERE teller in
 (
 (SELECT
 teller
 FROM `stories`
 WHERE org like '%tabitha%'
 group by teller)
 )
 and org not like '%tabitha%'
 group by teller, org

Je sens comme il y a un truc sur l'auto-joint ou le cas lorsque ce travail de force, mais je n'ai encore rien trouvé.

Était-ce utile?

La solution

Je ne suis pas tout à fait clair sur ce que vous essayez de faire, mais peut-être quelque chose comme ça?

select t1.org as org1, t2.org as org2, teller as scrib_id, count(teller) as weight 
from stories t1 join stories t2 where t1.teller=t2.teller and t1.org!=t2.org
group by teller,t1.org

Ceci effectuera une jointure entre t1 et t2 (à la fois la même table) sur conteur, il exclut les dossiers qui se joignent à

Je pourrais être loin, mais peut-être une version de la syntaxe de jointure peut aider.

Autres conseils

Cette requête a travaillé. Seule tweak de solution donnée était qu'il ne calculait pas correctement poids.

select t1.org as org1,
       t2.org as org2,
       t1.teller as scrib_id,
       count(distinct t1.story) as weight
       /* need to count the stories instead of the scribes now */    
from stories t1 join stories t2
where t1.teller=t2.teller
    and t1.org!=t2.org and t1.org not in ('none','[swahili]','[]')
    /* this just excludes nonsense categories */
    and t2.org not in ('none','[swahili]','[]')
group by t1.teller,t1.org
order by weight desc, t1.org;

Pour ma prochaine question - je ne sais même pas si possible, vous pouvez demander sql faire une correspondance sur teller APPROXIMATIVE ou scribe? Si ces numéros d'identification des numéros de téléphone et quelqu'un oublie l'un des chiffres, je voudrais encore les regrouper. Je suppose que cela est trop difficile à mysql - je besoin python ou quelque chose

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top