2010-12-09 5 views
1

Je voudrais reformater une table MySql pour l'utiliser dans un programme de mappage de nœud de réseau. Le format original est:Requête MySql pour obtenir toutes les combinaisons d'éléments dans le même champ de table

| ID | story | org | scribe | 

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

| org1 | org2 | scribe | weight of connection | 

org1 et org2 les deux viennent 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 d'entrées en double. Ce que je fais CAN CAN jusqu'à présent, c'est de tirer tous les orgs qui sont connectés à une organisation dans la liste en faisant une recherche '% text%' pour l'organisation, puis en excluant cette organisation de la sortie, comme :

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 

donc je me sens comme il y a un truc sur l'auto-joint ou le cas où cela pourrait fonctionner, mais je n'ai encore rien trouvé.

+0

Merci pour une réponse qui a fonctionné, avec un peu de peaufinage. –

Répondre

0

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 rejoignent pour se

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

+0

Bien! Je n'ai jamais utilisé deux conditions sur une jointure auparavant, mais je dois me rappeler que cela fonctionne ici. Le désordre le plus proche d'une jointure que j'ai fait est la formule pour obtenir des distributions cumulatives. Je posterai la requête finale ci-dessous: sélectionnez t1.org comme org1, t2.org comme org2, t1.teller comme scrib_id, count (t1.story distincte) que le poids des histoires t1 t2 où joindre des histoires t1.teller = t2.teller et t1.org! = t2.org et t1.org pas dans ('none', '[swahili]', '[]') et t2.org pas dans ('none' , '[swahili]', '[]') groupe par t1.teller, t1.org par poids desc, t1.org; –

0

Cette requête a fonctionné. Seul le tweak de la solution donnée était qu'il ne calculait pas correctement les 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, peut vous demander sql de faire une correspondance sur conteur APPROXIMATIVE ou scribe? Si ces identifiants sont des numéros de téléphone et que quelqu'un oublie l'un des chiffres, j'aimerais quand même les regrouper. Je suppose que c'est trop difficile à mysql - j'aurais besoin de python ou de quelque chose.

Questions connexes