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


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遍历每一行时,它将处理所有计数,而无需一遍又一遍地扫描整个表。


为了增加正确答案,建议的查询仅扫描表一次。

Answers:


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

与Aaron的solutio类似,语法较短:

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

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


非常简洁明了-但是当计数不适合TINYINT时会发生什么-您收到错误消息还是发生某种类型转换?
杰克说请尝试topanswers.xyz 2012年

TINYINT这个故事没有。SUM接受数字的任何类型(甚至是浮点数)并产生数字结果。您可以SUM通过TINYINT类型的列来获取成千上万的值-这不是问题。
Shlomi Noach 2012年

您当然知道bool是tinyint btw的代名词吗?
杰克说试试topanswers.xyz 2012年

是的,我的朋友,我确实知道这一点。首先,“ TINYINT这个故事中没有故事”可能不是一个好句子。
Shlomi Noach 2012年

1
给在此处偶然发现MS SQL Server特定答案的任何人的注释,此处SUM提到的功能在MS SQL Server中的工作方式不同。在Transct-SQL中,SUM只能与数字列一起使用。
user1451111

-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 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.