2010-04-07 84 views
3

如果我的表看起来像这样:计数枚举值?

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 

基本字段可以是yes或no。

如何计算日期范围内每列的有多少个是?

谢谢!

+0

当你有一个大的数据集并需要添加一个新的枚举类型时枚举列是讨厌的。根据模式,最多可能需要45分钟才能用新的枚举类型更新表,您可能需要考虑链接(数据透视表)。在您的具体示例中,您可能还需要考虑布尔列类型,因为它基于int基于文本而且速度会更快。 – 2011-12-05 21:13:53

回答

7

您可以运行三个查询是这样的:

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

或者,如果你愿意,你可以得到所有三个一次这样的:

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 

另一种方法是使用SUM而不是COUNT。你也可以尝试一下,看看它是如何影响性能的:

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

我明白了,所以我需要为每个查询运行不同的查询:销售,修理,运输?谢谢!! – 2010-04-07 20:46:47

+0

@John:如果你愿意,你可以在一个查询中完成。我给了你更多的选择,你可以尝试。 – 2010-04-07 20:52:27

+0

谢谢:)我会接受你的答案,但它说我必须再等3分钟(我猜想一个新的SO功能) – 2010-04-07 20:53:24