MySQL: подсчитать две вещи в одном запросе?

У меня есть "логический" столбец в одной из моих таблиц (значение равно 0 или 1).

Мне нужно получить два подсчета: количество строк, в которых логическое значение установлено на 0, и количество строк, в которых оно установлено на 1. В настоящее время у меня есть два запроса: один для подсчета 1, а другой для подсчета 0.

Обходит ли MySQL всю таблицу при подсчете строк с условием WHERE? Мне интересно, есть ли один запрос, который позволил бы использовать два счетчика на основе разных условий?

Или есть способ получить общее количество вместе с условным счетом WHERE? Этого было бы достаточно, так как мне нужно было бы только вычесть один счет из другого (из-за логического характера столбца). Нет значений NULL.

Спасибо.


person nebs    schedule 20.04.2010    source источник


Ответы (4)


Вы можете сгруппировать свои записи по своему логическому столбцу и получить количество для каждой группы.

 SELECT bool_column, COUNT(bool_column) FROM your_table
 WHERE your_conditions
 GROUP BY bool_column

Это, очевидно, будет работать не только для столбцов bool, но и с другими типами данных, если вам это нужно.

person RaYell    schedule 20.04.2010
comment
Потрясающе, спасибо! Я все еще новичок в MySQL, поэтому я не был слишком знаком с GROUP BY. - person nebs; 20.04.2010

Попробуй это:

SELECT
    SUM(your_field) as positive_count,
    SUM(IF(your_field, 0, 1)) as negative_count
FROM thetable
person newtover    schedule 20.04.2010
comment
Интересный подход. Как производительность SUM оценивается по сравнению с COUNT? - person nebs; 20.04.2010
comment
@Nebs: SUMming определенно будет работать быстрее, когда поле не проиндексировано, поскольку GROUP BY неявно требует сортировки по полю. Когда колонка проиндексирована, думаю, производительность будет аналогичной, хотя нужно проверять в конкретном случае. - person newtover; 20.04.2010

Если все они равны 0 или 1, и в результате вы не возражаете против 2 строк, вы можете сгруппировать по этому полю и выполнить подсчет следующим образом:

select field, count(field)
from table
group by field
person Fabian    schedule 20.04.2010

Простое групповое предложение должно помочь:

SELECT boolField, COUNT(boolField)
FROM myTable
GROUP BY boolField
person Thibault Falise    schedule 20.04.2010