2016-06-18 2 views
0

У меня есть таблица с большим количеством полей, и мне нужно вернуть COUNT NOT NULL для каждого поля.Выберите COUNT, где поле NOT 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, поэтому у вас может быть один «SELECT» с несколькими 'COUNT (...)' –

ответ

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), 
Смежные вопросы