2009-09-02 8 views
0

J'ai essayé différentes approches mais même si je pense que ma syntaxe est correcte, la requête ne fonctionne pas.Comptage du nombre total de réponses à partir des sondages dans MySQL

J'ai un système de sondage assez compliqué. En général chaque réponse au sondage est frappé légèrement dans une table

CREATE TABLE `polls` (
    `poll_id` int(10) NOT NULL auto_increment, 
    `client_id` int(10) NOT NULL, 
    `key` varchar(20) NOT NULL, 
    `val` varchar(30) NOT NULL, 
    PRIMARY KEY (`poll_id`) 
); 

La colonne « clé » est comme ID de certaines questions (comme pour «À quelle fréquence vous buvez du café la clé serait « café »), le la valeur varie en fonction de la question - parfois 0 ou 1, parfois 0-6, parfois c'est une chaîne. À des fins statistiques, je veux afficher le pourcentage de chaque réponse pour chaque question. J'utilise cette requête pour que:

SELECT p.`key`, p.val, COUNT(p.poll_id) AS people, 
(SELECT COUNT(client_id) FROM clients) AS total 
FROM polls AS p GROUP BY p.`key`, p.val ORDER BY p.`key`, p.val 

Le problème dans cette requête est que je dépends de table des clients pour obtenir le nombre total d'utilisateurs - qui ont travaillé lorsque chaque utilisateur a répondu à toutes les questions. Maintenant, nous avons ajouté une autre question au sondage et la requête ne fonctionne pas comme elle le devrait, car maintenant tous les utilisateurs ne répondent pas à cette question, mais le pourcentage est compté comme chaque utilisateur a répondu.

J'ai essayé de modifier la requête à quelque chose comme ça (j'ai essayé différentes façons, mais disons est venu à cela):

SELECT p.`key`, p.val, COUNT(p.poll_id) AS people, 
(SELECT COUNT(p2.poll_id) FROM polls AS p2 WHERE p2.`key` = p.`key`) AS total 
FROM polls AS p GROUP BY p.`key`, p.val ORDER BY p.`key`, p.val 

La façon dont je le vois - il devrait obtenir toutes les valeurs de la requête principale , le groupe, puis exécuter la sous-requête - donc j'obtenir quelque chose comme:

coffee , 0 , 10 , 30 
coffee , 1 , 15 , 30 
coffee , 2 , 5 , 30 
tea , 0 , 5 , 25 
tea , 1 , 5 , 25 
tea , 3 , 5 , 25 
tea , 4 , 10 , 25 

la dernière colonne compterait toutes les lignes qui ont la même clé et ignorer la colonne val (pour le café -> 10 + 15 + 5 = 30, pour le thé -> 5 + 5 + 5 + 10 = 25). La requête ne s'exécute pas. Il est en cours d'exécution et en cours d'exécution et finalement je dois l'annuler. Je sens que le problème est dans la partie "p2 key = p key" de la sous-requête, parce que si j'écris "p2. key = 'café'" la requête fonctionne comme un charme.

Répondre

0

ce n'est pas une véritable réponse à ma question, mais puisqu'il n'y a pas de réponse - peut-être il est impossible de faire ce que je veux dans une seule requête . mais il est possible de faire quelque chose de similaire:

SELECT p.`key`, p.val, COUNT(p.poll_id) AS people 
FROM polls AS p GROUP BY p.`key`, p.val WITH ROLLUP 

il résumera les valeurs avec le même donnée colonnes GROUP BY et ajoutez le nombre total avec colonne groupée = NULL. le résultat de mon problème ressemblerait à ceci:

coffee , 0 , 10 
coffee , 1 , 15 
coffee , 2 , 5 
coffee , NULL , 30 
tea , 0 , 5 
tea , 1 , 5 
tea , 3 , 5 
tea , 4 , 10 
tea , NULL , 25 
NULL , NULL , 55 

J'ai dû changer la mise en œuvre de mon application pour correspondre à ce qu'il recevait de la base de données, mais il fonctionne pour moi.

0

alors qu'est-ce que vous voulez compter? combien de réponses y a-t-il au total? il est aussi simple que:

SELECT COUNT(*) `count` 
    FROM `polls` 

mais peut-être que je compris vous mal ...

+0

Ce n'est pas ce que je veux - je veux obtenir le nombre de lignes avec la même valeur de clé - quelque chose comme ceci: 'SELECT COUNT (poll_id) des sondages GROUP BY key' L'astuce est que je veux l'obtenir dans une requête avec des données que je reçois déjà de la requête "originale". –

Questions connexes