How to use aliases in query for making conditions

2019-07-15 06:59发布

I have user table like as follows

user_id    name    gender    age
--------------------------------
1          AAA      Male      45
2          BBB      Female    22
3          CCC      Male      47
.................................
..............................

I want to get total no of users and total no of male users ans percent for male and female users

select count(*) as total , SUM(IF(v.gender = 'Male',1,0)) as totalMale ,
   SUM(IF(v.gender = 'Female',1,0)) as totalFemale , totalMale/total *100 ,
   totalFeMale/total *100 from user;

This query is not working when using aliases to calculate male and female percent. I am getting the error like unknown columns..........

select count(*) as total , SUM(IF(v.gender = 'Male',1,0)) as totalMale ,
SUM(IF(v.gender = 'Female',1,0)) as totalFemale , SUM(IF(v.gender = 'Male',1,0))/count(*) *100 ,SUM(IF(v.gender = 'Female',1,0))/count(*) *100 from user;

But this is working.

But is this i used SUM(IF(v.gender = 'Female',1,0)) 2 times.I think it will degrade the performance.

Can't i use aliases in my situation ?

Thanks in advance...

标签: mysql alias
2条回答
爷、活的狠高调
2楼-- · 2019-07-15 07:41

Your query is just fine. You can't use an alias at a select level. Your only option would be to have a derived table but that will indeed degrade performance.

Just one thing to improve the query performance would be to change the Gender column into just a boolean or char column.

Tip: All non-null boolean comparisons in MySQL resolve to 1 (true) and 0 (false), so you could simplify your query this way:

select
    count(*) total,
    SUM(gender = 'Male') totalMale,
    SUM(gender = 'Female') totalFemale,
    SUM(gender = 'Male') / count(*) * 100 percentageMale,
    SUM(gender = 'Female') / count(*) * 100 percentageFemale
from user
查看更多
不美不萌又怎样
3楼-- · 2019-07-15 07:48

Add inner query like this.

Select t1.total ,
t1.totalMale/total *100 ,
t1.totalFeMale/t1.total *100  
from 
(select 
count(user_id) as total , 
SUM(IF(v.gender = 'Male',1,0)) as totalMale ,
SUM(IF(v.gender = 'Female',1,0)) as totalFemale 
from user)t1;
查看更多
登录 后发表回答