2009-06-18 9 views
0

J'ai une table comme ceci:mysql requête

col1 col2 

2001 3001 
2002 3001 
2003 3001 
2004 3002 
2002 3003 
2001 3003 

je veux créer une requête qui découvre toute la combinaison d'éléments dans col1 avec un certain point dans col1 si elles se produisent à la même pièce col2 et la fréquence d'occurrence. Par exemple, si nous voulons explorer numéro de l'article « 2001 » dans col1 la requête doit retourner:

col3 col4 col5 
2001 2002 0.667 
2001 2003 0.333 

Quelqu'un peut-il me donner un indice? Merci d'avance.

+1

Cela n'a aucun sens Pour moi, pouvez-vous reformuler la question? –

+0

Vos données col2 dans le premier bloc sont-elles correctes? – northpole

+0

l'exemple de données et les résultats souhaités n'ont aucun sens - 2001 se produit deux fois dans col1 dans l'exemple, les valeurs col2 correspondantes sont 3001 et 3003, une fois chacune - pas de relation du tout avec la sortie désirée. –

Répondre

1

pensée de cette façon, vous essayez de relier la table elle-même par col2, donc nous allons commencer avec une jointure sur elle-même:

select left.col1, right.col1/*, ...*/ from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' /* ... */ 

maintenant pour votre ensemble. Vous voulez regrouper tous right.col1 pour obtenir le nombre pour cette colonne:

select left.col1, right.col1, COUNT(*) from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' group by right.col2 

que je crois sortirais avec les chiffres bruts. Je crois que vous devrez passer sur la requête et obtenir un total pour obtenir la fréquence. En guise de note, cela serait beaucoup plus compliqué si col1 n'était pas constant.

Edité ajouter: Si vous êtes à la recherche d'une requête, au lieu de itérer dans la langue que vous interrogez de, vous devez faire ce groupe deux fois:

SELECT abs_freq.col1, abs_freq.col2, abs_freq.freq/totals.total 
FROM (SELECT 
     left.col1 AS col1, 
     COUNT(*) AS total 
     FROM TABLE LEFT 
     INNER JOIN TABLE RIGHT 
     ON left.col2 = right.col2 
     WHERE left.col1 = '2001' 
     GROUP BY left.col1 
    ) totals 
INNER JOIN (SELECT 
       left.col1 AS col1, 
       right.col1 AS col2, 
       COUNT(*) AS freq 
      FROM TABLE LEFT 
      INNER JOIN TABLE RIGHT 
       ON left.col2 = right.col2 
      WHERE left.col1 = '2001' 
      GROUP BY right.col2 
      ) abs_freq 
    ON abs_freq.col1 = totals.col1 
+0

Pourriez-vous m'expliquer plus en détail comment obtenir la fréquence? –

+0

Le résultat renvoie trois colonnes. La troisième colonne de la requête ci-dessus est le nombre d'occurrences en termes absolus, donc vous auriez 2002 -> 2, et 2003 -> 1. Pour obtenir la fréquence, quelle que soit la langue que vous utilisez, obtenez le total (2 + 1), puis diviser la colonne par le total (2002 -> 2/(2 + 1) = 0,667, 2003 -> 1/(2 + 1) = 0,333) –

+0

J'utilise la requête suivante: sélectionnez C.tagid1, C .tagid2, C.partial * 1,0/somme (C.partial) de (sélectionner A.tagid tagid1, B.tagid tagid2, count (*) partielle principal A jointure interne principal B sur A.itemid = B. itemid où A.tagid! = B.tagid ET A.tagid = 2001 groupe par B.tagid) comme C; Cependant, il me renvoie seulement une ligne en raison de la fonction de somme. Avez-vous une idée de comment résoudre ce problème? –