簡體   English   中英

SQL:在同一行上顯示多個選擇count()

[英]SQL: multiple select count() displayed on same row

我需要計算一系列變量,然后將結果存儲在數組中。 這就是我的方法。

function statsQuery($array, $column, $table, $columnDate, $minDate, $maxDate) {
    global $query;
    $query = "select ";
    $index = 0;
    $flag = count($array);
    foreach ($array as $element) {
        $index++;
        if ($index == $flag) {
            $query .= "count(case when " . $column . " = '" . $element . "' then " . $column . " else null end) as " . $column . "_" . preg_replace('/\s+/', "_", $element) . " ";
        } else {
            $query .= "count(case when " . $column . " = '" . $element . "' then " . $column . " else null end) as " . $column . "_" . preg_replace('/\s+/', "_", $element) . ", ";
        }
    }
    $query .= " from " . $table;
    $query .= " where " . $columnDate . " between '" . $minDate . "' and '" . $maxDate . "'";
}

statsQuery($genderSection, 'gender', 'candidate', 'candidate_date_introduced', $minDate, $maxDate);

假設我有這個數組:

$genderSection= array('masculine', 'feminine', 'unspecified');

可能的輸出可以是:

gender_masculine |  gender_feminine  |  gender_unspecified   | 
--------------------------------------------------------------  
420              | 512               | 23                    |

但是,我需要使用的數據由這種類型的其他幾個變量組成。 例如:

$levelOptions = array('low', 'good', 'acceptable', 'exeptional');

我想實現以下目標:

gender_masculine |  gender_feminine  |  gender_unspecified   |  level_low |  level_good |  level_acceptable  |  level_exepctional   |  
------------------------------------------------------------------------------------------------------------------------------------- 
xx               | xx                | xx                    |  xx        |  xx         |  xx                |  xx                  |

我被困在SQL部分。 我無法弄清楚如何使SQL在同一行上返回結果。 我想到的最好的選擇是使用上面的腳本為每個變量運行單獨的查詢。 我嘗試了UNION,JOIN,但沒有運氣。

我的問題是:

  • 我如何查詢相同的表或不同的表並獲得count(case)作為單行? 我認為,如果我可以將所有內容存儲在數組中,那么使用foreach可以更輕松地操作和輸出數據。
  • 將所有內容都放在一行中是否提高了性能效率?還是應該堅持我目前的方法,並對每個變量單獨使用該函數?

抱歉,如果我的問題很愚蠢,我真的嘗試了所有可以找到的有關此主題的內容。 任何幫助將不勝感激。

添加了表結構。 數據通過HTML <select></select>引入。

id  |  gender       |  level        |
-------------------------------------
1   |  feminine     |  low          |
2   |  mascline     |  good         |
3   |  unspecified  |  acceptable   |
4   |  feminine     |  exceptional  |
.....................................
n   |  feminine     |  exceptional  |

嘗試使用這種格式的查詢

SELECT 
count(*) AS total,
SUM(CASE WHEN gender = 'masculine' THEN 1 ELSE 0 END) AS gender_masculine,
SUM(CASE WHEN gender = 'feminine' THEN 1 ELSE 0 END) AS gender_feminine,
SUM(CASE WHEN gender = 'unspecified' THEN 1 ELSE 0 END) AS gender_unspecified,
SUM(CASE WHEN level = 'low' THEN 1 ELSE 0 END) AS level_low,
SUM(CASE WHEN level = 'good' THEN 1 ELSE 0 END) AS level_good,
SUM(CASE WHEN level = 'acceptable' THEN 1 ELSE 0 END) AS level_acceptable,
SUM(CASE WHEN level = 'exceptional' THEN 1 ELSE 0 END) AS level_exceptional
from table

您可以嘗試如下操作:

SELECT SUM( IF( gender =  'masculine', 1, 0 ) ) AS gender_masculine, SUM( IF( gender =  'feminine', 1, 0 ) ) AS gender_feminine, SUM( IF( gender =  'unspecified', 1, 0 ) ) AS gender_unspecified, SUM( IF( nlevel =  'low', 1, 0 ) ) AS level_low, SUM( IF( nlevel =  'good', 1, 0 ) ) AS level_good, SUM( IF( nlevel =  'acceptable', 1, 0 ) ) AS level_acceptable, SUM( IF( nlevel =  'exceptional', 1, 0 ) ) AS level_exceptional FROM a_temp

第二種方法:您也可以嘗試:

SELECT  `nlevel` AS tags, COUNT(  `nlevel` ) AS totals FROM a_temp GROUP BY  `nlevel` UNION ALL SELECT gender AS tags, COUNT( gender ) AS totals FROM a_temp GROUP BY  `gender`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM