如何在mysql中使用别名来创建查询条件

3
我有一个名为user的表格,如下所示:
user_id    name    gender    age
--------------------------------
1          AAA      Male      45
2          BBB      Female    22
3          CCC      Male      47
.................................
..............................

我想获取用户总数、男性用户总数以及男女用户的百分比。

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;

当使用别名计算男性和女性百分比时,此查询无法正常工作。我收到了以下错误: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;

但是这个是有效的。

但是我使用了SUM(IF(v.gender = 'Female',1,0))两次。我觉得这会降低性能。

在我的情况下,我不能使用别名吗?

提前感谢...

2个回答

1
你的查询没问题。在select级别上不能使用别名。你唯一的选择是使用派生表,但这会降低性能。
仅有一个改善查询性能的方法就是将Gender列更改为布尔或字符列。
提示:在MySQL中,所有非空布尔比较都解析为1(true)和0(false),因此你可以通过以下方式简化查询:
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

但是在这里,我有与性别相关的其他条件。 - PSR
我可以这样写 SUM(gender = 'Male' and condition2 and conditiond3) 吗? - PSR
相同的规则适用。COND1 and COND2 and COND3将始终返回true或false(对于非空操作数)。 - Mosty Mostacho
你的意思是在数据库中更改列的数据类型吗? - PSR
是的。正如我所提到的,唯一的性能问题就是在性别字段上使用char/varchar类型,因为它只有(很可能)两个值。其余的只是一些小技巧,可以使查询更易读,但与性能无关。 - Mosty Mostacho
显示剩余2条评论

0

像这样添加内部查询。

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;

据我所知,它们之间的性能差别不大。 - Pramod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接