Как сделать несколько подсчетов в одном запросе?

12

Я считаю записи с такими запросами, как

SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%something%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%another%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%word%'

Для каждого подсчета mysql должен обходить всю таблицу, и это большая проблема, если иметь длинную таблицу и многочисленные запросы.

Интересно, есть ли способ сделать все подсчеты в одном запросе? В этом случае, когда mysql проходит по каждой строке, он будет обрабатывать все подсчеты, и нет необходимости сканировать всю таблицу снова и снова.

Googlebot
источник
Чтобы добавить правильные ответы, предлагаемые запросы сканируют таблицу только один раз.

Ответы:

21

Чтобы получить счет для каждого из тех, кого вы можете попробовать

SELECT
    COUNT(CASE WHEN `col1` LIKE '%something%' THEN 1 END) AS count1,
    COUNT(CASE WHEN `col1` LIKE '%another%' THEN 1 END) AS count2,
    COUNT(CASE WHEN `col1` LIKE '%word%' THEN 1 END) AS count3
FROM `table1`; 
Аарон В.
источник
16

Аналогично решению Аарона, более короткий синтаксис:

SELECT
    SUM(col1 LIKE '%something%') AS count1,
    SUM(col1 LIKE '%another%') AS count2,
    SUM(col1 LIKE '%word%') AS count3
FROM `table1`

Выражение LIKE приводит к логическому результату. TRUEравно 1 , FALSEравно 0 , поэтому CASEздесь избыточно.

Шломи Ноах
источник
Очень аккуратно и кратко - но что происходит, когда счетчики не помещаются в TINYINT - вы получаете ошибку или происходит какое-то преобразование типа?
Джек говорит, попробуйте topanswers.xyz
Там нет TINYINTв этой истории. SUMберет любой тип числа (даже с плавающей точкой) и выдает числовой результат. Вы можете SUMстолбцы TINYINTтипа, чтобы получить значения в тысячах - это не проблема.
Шломи Ноах
Вы, конечно, знаете, что bool является синонимом tinyint кстати?
Джек говорит, попробуйте topanswers.xyz
Да, мой друг, я это знаю. «Нет TINYINTв этой истории», возможно, было не очень хорошим предложением для начала.
Шломи Ноах
1
Примечание для тех, кто сталкивается здесь в поисках конкретного ответа для MS SQL Server, SUMупомянутая здесь функция работает не так, как в MS SQL Server. В Transct-SQL SUMможно использовать только числовые столбцы.
user1451111
-1

Если я правильно понял вашу потребность, возможно, это поможет:

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;
JohnP
источник
1
Если вы посмотрите на Аарона, то, вероятно, вам нужно получить несколько счетов, а не сумму всех.
JohnP