2012-12-11 96 views
2

我正在嘗試獲取表中性別字段中女性和男性的數量。在一個查詢中獲取兩個表字段的計數

有沒有辦法讓每個查詢的計數?

喜歡的東西:

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'; 
+0

這與'sequel'(與'SQL'相對)如何? –

回答

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

+0

謝謝,加快了我的查詢不少。 – Brad

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 
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 ... 

應該只是罰款!

0

如果你唯一的問題是避免兩個查詢,你總是可以寫兩個查詢作爲子查詢一個查詢。

選擇雙

這(從雙選1)爲一體,(選擇雙2)兩個工作會爲你的情況了。

+0

如果避免多個查詢的原因是性能,這將無濟於事。還是一個不錯的主意。 –

+0

如果你的數據庫連接非常慢,這個查詢會更快;-) – sorencito

相關問題