在一个查询中获取两个表字段的计数

时间:2012-12-11 19:19:02

标签: mysql

我试图在表格的性别字段中计算女性和男性的数量。

有没有办法在一个查询中获取每个查询的数量?

类似的东西:

select * from table count(where gender = 'm') as total_males, count(where gender = 'f') as total_females;

还是需要两次查询?

select count(*) from table where gender = 'm';
select count(*) from table where gender = 'f';

4 个答案:

答案 0 :(得分:3)

这基本上是PIVOT。 MySQL没有数据透视表,因此您可以使用带有CASE语句的聚合函数来执行此操作:

select
  sum(case when gender = 'm' then 1 else 0 end) Total_Male,
  sum(case when gender = 'f' then 1 else 0 end) Total_Female
from yourtable

请参阅SQL Fiddle with Demo

或使用COUNT

select
  count(case when gender = 'm' then 1 else null end) Total_Male,
  count(case when gender = 'f' then 1 else null end) Total_Female
from yourtable;

请参阅SQL Fiddle with Demo

答案 1 :(得分:2)

这样的事情会起作用:

SELECT SUM(IF(t.gender='m',1,0)) AS total_males
     , SUM(IF(t.gender='f',1,0)) AS total_females
  FROM mytable t

这里的“技巧”是我们使用条件测试为每一行返回0或1,然后将0和1加起来。为了更清楚一点,我使用SUM聚合函数而不是COUNT,虽然COUNT可以很容易地使用,但我们需要返回一个NULL零的位置。

SELECT COUNT(IF(t.gender='m',1,NULL)) AS total_males
     , COUNT(IF(t.gender='f',1,NULL)) AS total_females
  FROM mytable t

考虑此查询的SELECT列表中的两个表达式:

SELECT COUNT(1) 
     , SUM(1)
  FROM mytable t 

将返回相同的值。

如果要避免使用MySQL IF函数,也可以使用ANSI SQL CASE表达式来完成:

SELECT SUM( CASE WHEN t.gender = 'm' THEN 1 ELSE 0 END )) AS total_males
     , SUM( CASE WHEN t.gender = 'f' THEN 1 ELSE 0 END )) AS total_females
  FROM mytable t

答案 2 :(得分:1)

select sum(case when gender='m' then 1 else null end) as total_males,  sum(case when gender='f' then 1 else null end) as total_females from ... 

应该工作得很好!

答案 3 :(得分:0)

如果你唯一的问题是避免两个查询,你总是可以写两个查询作为一个查询的子选择。

选择(从双音色中选择1)作为一个,(从双音色中选择2)作为双音色中的两个

这也适用于您的场景。