Як зробити кілька підрахунків за один запит?


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 буде проходити по кожному рядку, він обробляє всі підрахунки, і не потрібно сканувати всю таблицю знову і знову.


Щоб додати правильні відповіді, запропоновані запити сканують таблицю лише один раз.

Відповіді:


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

Схожий на solutio Аарона, коротший синтаксис:

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 btw?
Джек каже, спробуйте topanswers.xyz

Так, друже, я це знаю. "Немає TINYINTв цій історії", мабуть, не вдале речення.
Шломі Ноач

1
Примітка для всіх, хто натрапляє тут на пошуки конкретної відповіді MS SQL Server, SUMфункція, про яку йдеться тут, не працює так само, як у MS SQL Server. У Transct-SQL SUMможна використовувати лише числові стовпці.
користувач1451111

-1

Якщо я зрозумію вашу потребу правильно, можливо, це зробить трюк:

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;

1
Дивлячись на Aarons anwser, що, мабуть, те, що ви шукаєте - щоб отримати кілька підрахунків - не сума всіх підрахунків.
JohnP
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.