2010-04-07 3 views
3

Si ma table ressemble à ceci:Compte les valeurs énumérées?

CREATE TABLE `daily_individual_tracking` (
    `daily_individual_tracking_id` int(10) unsigned NOT NULL auto_increment, 
    `daily_individual_tracking_date` date NOT NULL default ''0000-00-00'', 
    `sales` enum(''no'',''yes'') NOT NULL COMMENT ''no'', 
    `repairs` enum(''no'',''yes'') NOT NULL COMMENT ''no'', 
    `shipping` enum(''no'',''yes'') NOT NULL COMMENT ''no'', 
    PRIMARY KEY (`daily_individual_tracking_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 

essentiellement les champs peuvent être oui ou non.

Comment puis-je compter le nombre de oui pour chaque colonne sur une plage de dates?

Merci!

+0

Les colonnes enum sont désagréables lorsque vous avez un grand ensemble de données et que vous devez ajouter un nouveau type enum. Selon le schéma, il peut prendre jusqu'à 45 minutes pour mettre à jour une table avec un nouveau type enum, vous pouvez envisager une table de liaison (pivot). Dans votre exemple spécifique, vous pouvez également envisager un type de colonne booléenne, car il est basé sur les int plutôt que sur le texte et sera beaucoup plus rapide. –

Répondre

7

Vous pouvez exécuter trois requêtes comme ceci:

SELECT COUNT(*) 
FROM daily_individual_tracking 
WHERE sales = 'YES' 
AND daily_individual_tracking_date BETWEEN '2010-01-01' AND '2010-03-31' 

Ou si vous voulez, vous pouvez obtenir tous les trois à la fois comme ceci:

SELECT (
    SELECT COUNT(*) 
    FROM daily_individual_tracking 
    WHERE sales = 'YES' 
    AND daily_individual_tracking_date BETWEEN '2010-01-01' AND '2010-03-31' 
) AS sales_count, (
    SELECT COUNT(*) 
    FROM daily_individual_tracking 
    WHERE repairs = 'YES' 
    AND daily_individual_tracking_date BETWEEN '2010-01-01' AND '2010-03-31' 
) AS repairs_count, (
    SELECT COUNT(*) 
    FROM daily_individual_tracking 
    WHERE shipping = 'YES' 
    AND daily_individual_tracking_date BETWEEN '2010-01-01' AND '2010-03-31' 
) AS shipping_count 

Une autre façon de le faire est d'utiliser SUM au lieu de COUNT. Vous pouvez essayer cela aussi pour voir comment cela affecte la performance:

SELECT 
    SUM(sales = 'YES') AS sales_count, 
    SUM(repairs = 'YES') AS repairs_count, 
    SUM(shipping = 'YES') AS shipping_count 
FROM daily_individual_tracking 
WHERE daily_individual_tracking_date BETWEEN '2010-01-01' AND '2010-03-31' 
+0

Je vois, alors ai-je besoin d'un pour exécuter une requête différente pour chacun: ventes, réparations, expédition? Merci!! –

+0

@John: Vous pouvez le faire dans une requête si vous le souhaitez. Je vous ai donné quelques options supplémentaires que vous pourriez essayer. –

+0

Merci :) Je vais accepter votre réponse, mais il est dit que je dois attendre 3 minutes de plus (une nouvelle fonctionnalité SO je suppose) –

Questions connexes