2016-06-18 14 views
0

フィールドが多数あるテーブルがあり、フィールドごとにNOT NULLのCOUNTを返す必要があります。テーブルのフィールドごとにフィールドがNULLでないフィールドを選択します。

私はPHPでループを作り、私はフィールドによって1つの要求を実行...

$result = array(); 
$champs = array("field1", "field2", "field3", "field4", "field5", "field6", "field7", "field8", "field9", "field10", "field11", "field12", "field13", "field14", "field15", "field16", "field17", "field18", "field19", "field20"); 

foreach ($champs as $value) { 
    $and = empty($filtroAdd) ? "$value IS NOT NULL" : "AND $value IS NOT NULL"; 

    $requete = "SELECT COUNT($value) 
       FROM my_table 
       WHERE $filtroAdd $and"; 
    $r = $db->query($requete)->fetch(PDO::FETCH_NUM); 

    $result[$value] = $r[0]; 
} 

print_r($result); 

私はそれがより良い方法はないと思う、と私たちは確かに、単一のPostgreSQLのリクエストで同じ最終的な結果を返すことができます。 ?!ヘルプ

+3

'COUNT(<カラムまたは式>)' 'すでにNULL'値を除外します。 http://www.techonthenet.com/postgresql/functions/count.phpを参照して、複数の 'COUNT(...)'を持つ単一の 'SELECT'を持つことができます。 –

答えて

2

ため

ありがとうございますが、単一のクエリを使用することができます。フィールドごとに別々のクエリを実行する必要はありません

SELECT COUNT(field1), COUNT(field2), COUNT(field3), . . . 
FROM my_table; 

COUNT(<field>)は、その列にNULL以外の値を持つ行の数を返します。

あなたは異なる値の数をしたい場合は、COUNT(DISTINCT)を使用します。

SELECT COUNT(DISTINCT field1), COUNT(DISTINCT field2), COUNT(DISTINCT field3), . . . 
FROM my_table; 

あなたが好きな場合は、CASEロジックをも埋め込むことができます。私は通常SUM()を使用してこの操作を行います。

SELECT SUM(CASE WHEN field1 > 0 THEN 1 ELSE 0 END), 
関連する問題