2009-12-25 4 views
1

J'ai une table MySQL contenant 115 champs comme ceux-ci:occurrence le comptage MySQL des valeurs dans un champ

v1q1 v1q2 v2q1 v2q2 v3q1 v3q3 (...) 

Les enregistrements contiennent tous une de la valeur 0, 1, 2, 3 ou 4.

Maintenant je dois compter pour chaque champ le nombre d'enregistrements contenant un 0, le nombre d'enregistrements contenant un 1, le nombre d'enregistrements contenant un 2, ... (jusqu'à 4).

Comment puis-je accomplir cela d'une manière plutôt efficace?

Répondre

3

Vous pouvez utiliser l'instruction IF et de faire un sum comme celui-ci:

SELECT 
SUM(IF(v1q1=0, 1, 0)) as cnt0, 
SUM(IF(v1q1=1, 1, 0)) as cnt1, 
SUM(IF(v1q1=2, 1, 0)) as cnt2, 
SUM(IF(v1q1=3, 1, 0)) as cnt3, 
SUM(IF(v1q1=4, 1, 0)) as cnt4 
FROM `myTable` 
3

Vous ne pouvez pas faire cela de quelque façon efficace. La mise en page de la base de données elle-même est inefficace, et vous ne pouvez pas surmonter cela avec n'importe quel type de requête. Patrick vous a montré comment le faire pour un seul champ dans la table. Maintenant, faites une requête qui contient 115 fois ... Comme vous le voyez, ce n'est pas efficace.

Vous devriez avoir les valeurs dans la table où les données que vous avez maintenant dans les noms de champs sont où les données appartiennent; dans les domaines:

id v q value 
------------- 
1 1 1 2 
1 1 2 4 
1 2 1 0 
1 2 2 1 
1 3 1 3 
1 3 3 2 
2 1 1 0 
2 1 2 1 
2 1 2 0 
2 2 1 4 
... 

Maintenant que vous avez toutes les données sous forme de données réelles, vous pouvez obtenir les informations efficacement:

select v, q, value, count(*) 
from TheTable 
group by v, q, value 
+0

hm, vous avez un point ici – Glenn