我有学生记录,我需要按年龄分组。我有这种情况:
我想出了这个查询
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
,但它没有用。请告诉我如何改进这一点。感谢。
答案 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)
检查x
是NULL
并且不计算它们。