web-dev-qa-db-fra.com

Comment faire plusieurs comptes en une seule requête?

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 comptage, 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.

11
Googlebot

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`; 
20
Aaron W.

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. TRUE est 1, FALSE est , donc le CASE est redondant ici.

16
Shlomi Noach