2015-06-26 53 views
0

我有一個學生記錄,我需要按年齡分組。我有這樣的場景:具有相同Count功能的SQL多個CASE時

  • 如果年齡組只有一個成員,顯示他/她的姓名和性別
  • 否則
    • 顯示「一些字符串」作爲名稱
    • 檢查成員的性別,如果全部FEMALE,則返回FEMALE。如果所有的男性,男的回報,否則返回MIX

我想出了這個查詢

SELECT Count(id) as GROUP_SIZE, 
    CASE WHEN COUNT(id) = 1 THEN name ELSE 'SOME STRING' END as name, 
    CASE WHEN COUNT(id) = 1 THEN sex ELSE (
     CASE WHEN COUNT(CASE WHEN sex = 'MALE' THEN 1 END) = 0 THEN 'FEMALE' 
      WHEN COUNT(CASE WHEN sex = 'FEMALE' THEN 1 END) = 0 THEN 'MALE' 
      ELSE 'MIX' 
     END 
    ) END as sex 
    FROM students GROUP BY age     

這個查詢輸出我要的情景,但我多次調用數(ID)。這會影響性能作爲多個計數被稱爲?或者如果Count(id)被執行一次,它是否會在成功調用Count(id)時有一個恆定的時間?我試過CASE WHEN GROUP_SIZE但它不工作。請告訴我如何改善這一點。謝謝。

回答

1

我不太確定如何優化MySQL,當涉及到count(COLUMN)時,但是如果使用count(1)代替,您將獲得(至少相等)最佳性能。

+2

參考:http://stackoverflow.com/questions/2876909/count-and-countcolumn-name-whats-the-diff – Barmar

1

我期望它重用該值。當您使用GROUP BY時,它必須將所有行收集到組中。包含這些組的數據結構可能具有組中元素的大小,因此它不必進行任何實際的計數,而是在創建組的過程中完成。

1

也許沒有多大關係的表現,但怎麼看這樣的感覺:

SELECT age, -- (I think you forgot this) 
     GROUP_SIZE, 
     IF (GROUP_SIZE = 1, a_name, 'SOME STRING) AS name, 
     IF (min_sex = max_sex, max_sex, 'MIX') AS sex 
    FROM 
     (SELECT COUNT(*) AS GROUP_SIZE, 
       MAX(name) AS a_name, 
       MAX(sex) AS max_sex, 
       MIN(sex) AS min_sex, 
      FROM students 
      GROUP BY age 
    ) z 
    ORDER BY age; -- (you probably wanted this) 

COUNT(*)是正常的模式。 COUNT(x)檢查xNULL並且不計數。