mysql - 如何在额外列中显示值的计数

标签 mysql sql

假设我们有一个这样的表:

id  value
 1      a
 2      b
 3      a
 4      a
 5      b

这样查询

SELECT * , COUNT( * )
FROM test
GROUP BY value

给我们一个这样的表:

id  value COUNT(*)
 1      a       3
 2      b       2

这告诉我们表中有三个“a”和两个“b”。

问题是:是否可以进行一个查询(没有嵌套的 SELECT),它会产生一个像这样的表

id  value count_in_col
 1      a            3
 2      b            2
 3      a            3
 4      a            3
 5      b            2

目标是避免折叠列并将整个列中的“值”元素的数量添加到每一行。

最佳答案

是的,仅使用单个 SELECT 关键字就可以返回指定的结果集。

 SELECT t.id
      , t.value
      , COUNT(DISTINCT u.id) AS count_in_col
   FROM mytable t
   JOIN mytable u
     ON u.value = t.value
  GROUP
     BY t.id

设置测试用例:

 CREATE TABLE `mytable` (`id` INT, `value` VARCHAR(1));
 INSERT INTO `mytable` VALUES (1,'a'), (2,'b'),(3,'a'),(4,'a'),(5,'b');

返回:

    id  value   count_in_col  
------  ------  --------------
     1  a                    3
     2  b                    2
     3  a                    3
     4  a                    3
     5  b                    2

注意:

这假设 id 在表中是唯一的,这将由主键或唯一键约束强制执行。

就性能而言,根据基数,索引 ... ON (value,id) 可能会提高性能。

这种方法(使用 JOIN 来匹配 value 列上的行)确实有可能产生非常大的中间结果集,如果有“很多”行匹配 >值(value)。例如,如果有 1,000 行 value='a',则这些行的中间结果集将为 1,000*1,000 = 1,000,000 行。

添加谓词(在 ON 子句中)也可以提高性能,但会减少中间结果中的行数。

    ON u.value = t.value
   AND u.id >= t.id

(没有真正的魔法;“技巧”是使用 COUNT(DISTINCT id) 来避免相同的 id 值被多次计算。)

关于mysql - 如何在额外列中显示值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20170669/

相关文章:

sql - 使用 TYPE ='MYISAM' 恢复 mysqldump 备份

mysql - 我如何使用hibernate在jsp页面中登录

mysql - 与多个值进行比较时如何返回多行?

sql - 此表和查询的最佳索引?

sql - 使用 ORDER BY NEWID() 生成随机测试数据,包括重复的行

mysql - 获取特定时间的数据

mysql - 从sql中获取列名

javascript - 为什么SQL返回的字符串长度和其他语言返回的字符串长度不一样?

MySql 查询将包含定界符的列转换为行

mysql - 如何将查询分组或连接在一起以获得我需要的项目列表