2015-06-26 49 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并且不计数。