2012-02-19 158 views
1

評估數據我有一個MySQL數據庫表具有以下colums閱讀從MySQL數據庫

ID 
status (can contain values 0, 1, 2) 
timepstamp 
text 
note 
owner 

我想獲得關於非特異性老闆從表中的條目下列信息:

number of entries 
number of entries where status=0 
number of entries where status=1 
number of entries where status=2 
number of entries where LENGTH(note)>0 
minimum timestamp 
maximum timestamp 

我用來讀取完整的數據集,然後使用

SELECT status, timestamp, LENGTH(note)>0 WHERE owner="name"; 

我用PHP對其進行評估有一些用戶有這麼多條目的問題,以至於如果我將數據讀取到PHP中,我經常會遇到內存不足錯誤。我認爲讓MySQL評估數據應該更具性能。我無法寫出能夠完成此任務的查詢。

SELECT 
    MIN(timestamp) AS mintime, 
    MAX(timestamp) AS maxtime, 
    COUNT(*) AS number, 
    ... 
WHERE owner="name" 

難道在某種程度上可以一次獲得結果嗎?例如用嵌套的WHERE或IF內的COUNT?

COUNT(WHERE status=0) AS inactive 
    COUNT(IF(status=1)) AS active 
    ... 

你會如何解決這個問題?

回答

3

這給一個嘗試 -

SELECT 
    COUNT(*) AS total, 
    SUM(IF(status=0, 1, 0)) AS stat0, 
    SUM(IF(status=1, 1, 0)) AS stat1, 
    SUM(IF(status=2, 1, 0)) AS stat2, 
    SUM(IF(LENGTH(note)>0, 1, 0)) AS notes, 
    MIN(timestamp) AS mintime, 
    MAX(timestamp) AS maxtime 
FROM tbl_name 
WHERE owner="name" 
GROUP BY owner 
+0

工作正常。由於我使用的是ENUM,所以我必須改變的僅僅是狀態的值。看起來,MySQL正在使用鍵進行比較(並且值「0」的鍵爲「1」,...) – 2012-02-20 08:30:02

0

試試這個:

SELECT 
MIN(`timestamp`) AS `mintime`, 
MAX(`timestamp`) AS `maxtime`, 
COUNT(`ID`) AS `number`, 
(SELECT COUNT(`ID`) FROM `Table` WHERE `owner` = 'owner' AND `status` = 0) AS `inactive`, 
(SELECT COUNT(`ID`) FROM `Table` WHERE `owner` = 'owner' AND `status` = 1) AS `active`, 
(SELECT COUNT(`ID`) FROM `Table` WHERE `owner` = 'owner' AND LENGTH(`note`)>0) AS `longentries` 
FROM `Table` 
WHERE `owner` = 'name' 

你或許應該考慮規範化數據庫設計,不過,這樣你將有兩個單獨的表,一個是用戶和一個條目,像這樣:

USERS ID 名 狀態

參賽作品 ID user_ID的 時間戳 文本 說明(如果這是一個特定的入口域;否則將它移動到桌面上)用戶名:密碼:

希望這會有所幫助。

+2

您關於規範化設計的觀點是有效的,但使用子查詢來獲取這些統計數據非常有效沒有多次讀取就可以輕鬆完成,效率低下。 – nnichols 2012-02-19 22:27:13

+0

我沒有看到任何非標準化的東西。 '狀態'很可能是行的狀態,whatevere存儲(文本,註釋),而不是所有者的狀態。 – 2012-02-19 22:31:08

+0

公平點,謝謝!我甚至不知道你可以使用你在答案中使用的語法,nnichols。生活和學習:)給你+1! – Daan 2012-02-20 09:58:14