SQL多个CASE WHEN具有相同的Count函数

时间:2015-06-26 06:21:51

标签: mysql sql optimization query-optimization mariadb

我有学生记录,我需要按年龄分组。我有这种情况:

  • 如果年龄组只有一名成员,则显示他/她的姓名和性别
  • 否则
    • 将“SOME STRING”显示为名称
    • 检查会员的性别,如果所有女性,请返回FEMALE。如果全部是MALE,则返回MALE,否则返回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                

此查询输出我想要的场景,但我有多次调用Count(id)。当调用多个Count时,这会影响性能吗?或者,如果Count(id)执行一次,它是否会在成功调用Count(id)时有一个恒定的时间?我试过了CASE WHEN GROUP_SIZE,但它没有用。请告诉我如何改进这一点。感谢。

3 个答案:

答案 0 :(得分:1)

我不确定如何优化MySQL count(COLUMN),但是如果你使用count(1),你将获得(至少相等)最佳性能。

答案 1 :(得分:1)

我希望它重用该值。使用GROUP BY时,必须将所有行收集到组中。保存组的数据结构可能具有元素中组的大小,因此它不必进行任何实际计数,它是在制作组的过程中完成的。

答案 2 :(得分: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并且不计算它们。