如何在一个查询中进行多个计数?

Goo*_*bot 14 mysql performance query count query-performance

我用查询来计算记录

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%'
Run Code Online (Sandbox Code Playgroud)

对于每一个计数,mysql都需要遍历整个表,如果表很长,查询很多,这是一个大问题。

我想知道是否有一种方法可以在一个查询中进行所有计数。在这种情况下,当mysql遍历每一行时,它会处理所有计数,而无需一遍又一遍地扫描整个表。

Aar*_* W. 27

要计算您可以尝试的每一个

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`; 
Run Code Online (Sandbox Code Playgroud)


Shl*_*ach 17

类似于 Aaron 的解决方案,更短的语法:

SELECT
    SUM(col1 LIKE '%something%') AS count1,
    SUM(col1 LIKE '%another%') AS count2,
    SUM(col1 LIKE '%word%') AS count3
FROM `table1`
Run Code Online (Sandbox Code Playgroud)

LIKE 表达式产生一个布尔结果。TRUE1FALSE0,所以CASE这里是多余的。

  • 任何在此处偶然发现 MS SQL Server 特定答案的人请注意,此处提到的“SUM”函数在 MS SQL Server 中的工作方式不同。在 Transct-SQL 中,`SUM` 只能用于数字列。 (2认同)