Come effettuare più conteggi in una query?


11

Conto i record con domande come

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%'

Per ogni conteggio, mysql ha bisogno di camminare su tutto il tavolo, e questo è un grosso problema se si ha un tavolo lungo e numerose query.

Mi chiedo se c'è un modo per fare tutti i conteggi in una query. In questo caso, quando mysql cammina su ogni riga, elabora tutti i conteggi e non è necessario sottoporre a scansione l'intera tabella più e più volte.


Per aggiungere alle risposte corrette, le query suggerite eseguono la scansione della tabella una sola volta.

Risposte:


20

Per ottenere un conteggio per ognuno di quelli che puoi provare

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

Simile alla soluzione di Aaron, sintassi più breve:

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

L'espressione LIKE produce un risultato booleano. TRUEè 1 , FALSEè 0 , quindi CASEqui è ridondante.


Molto pulito e conciso - ma cosa succede quando i conteggi non rientrano in un TINYINT - ricevi un errore o si verifica una sorta di conversione del tipo?
Jack dice di provare topanswers.xyz il

Non c'è TINYINTin questa storia. SUMprende qualunque tipo di numero (anche float) e produce un risultato numerico. Puoi inserire SUMcolonne di TINYINTtipo per ottenere valori in migliaia - questo non è un problema.
Shlomi Noach,

Sai naturalmente che bool è sinonimo di tinyint tra parentesi?
Jack dice di provare topanswers.xyz il

Sì, amico mio, lo so. Il "Non c'è TINYINTin questa storia" forse non era una buona frase per cominciare.
Shlomi Noach,

1
Una nota per chiunque inciampare qui in cerca di una risposta specifica per MS SQL Server, la SUMfunzione come menzionata qui non funziona allo stesso modo in MS SQL Server. In Transct-SQL SUMpuò essere utilizzato solo con colonne numeriche.
user1451111

-1

Se avrò le tue necessità giuste, forse questo farà il trucco:

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

1
Guardare la risposta di Aarons che è probabilmente ciò che stai cercando - ottenere più conteggi - non la somma di tutti i conteggi.
JohnP,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.