[英]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.