2010-04-07 208 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