Comment faire plusieurs comptes en une seule requête?

11

Je compte les enregistrements avec des requêtes comme

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

Pour chaque nombre, mysql doit parcourir la table, et c'est un gros problème si vous avez une longue table et de nombreuses requêtes.

Je me demande s'il existe un moyen de faire tous les comptes en une seule requête. Dans ce cas, lorsque mysql parcourt chaque ligne, il traitera tous les décomptes, et pas besoin de balayer la table entière encore et encore.

Googlebot
la source
Pour compléter les réponses qui sont correctes, les requêtes suggérées ne parcourent le tableau qu'une seule fois.

Réponses:

20

Pour obtenir un décompte pour chacun de ceux que vous pouvez essayer

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`; 
Aaron W.
la source
16

Similaire à la solutio d'Aaron, syntaxe plus courte:

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

L'expression LIKE donne un résultat booléen. TRUEest 1 , FALSEest 0 , donc le CASEest redondant ici.

Shlomi Noach
la source
Très soigné et concis - mais que se passe-t-il lorsque les nombres ne tiennent pas dans un TINYINT - obtenez-vous une erreur ou une sorte de conversion de type se produit-elle?
Jack dit d'essayer topanswers.xyz
Il n'y a rien TINYINTdans cette histoire. SUMprend n'importe quel type de nombre (même flottant) et produit un résultat numérique. Vous pouvez des SUMcolonnes de TINYINTtype pour obtenir des valeurs par milliers - ce n'est pas un problème.
Shlomi Noach
Vous savez bien sûr que bool est synonyme de tinyint btw?
Jack dit d'essayer topanswers.xyz
Oui, mon ami, je le sais. Le "il n'y a pas TINYINTdans cette histoire" n'était peut-être pas une bonne phrase pour commencer.
Shlomi Noach
1
Une note pour quiconque tombe ici à la recherche d'une réponse spécifique à MS SQL Server, la SUMfonction mentionnée ici ne fonctionne pas de la même manière dans MS SQL Server. Dans Transct-SQL SUMne peut être utilisé qu'avec des colonnes numériques.
user1451111
-1

Si je réponds à vos besoins, cela fera peut-être l'affaire:

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;
JohnP
la source
1
En regardant la réponse d'Aarons, c'est probablement ce que vous recherchez - pour obtenir plusieurs chefs d'accusation - pas la somme de tous les chefs d'accusation.
JohnP