【问题标题】:How to add a counting column for specific values (as sub-select)如何为特定值添加计数列(作为子选择)
【发布时间】:2021-12-22 09:41:42
【问题描述】:

我有一个要添加列的查询。它应该包含特定列的值在该表中出现的次数。

我目前的尝试

SELECT cleaning.*,
    (SELECT COUNT(*)
        FROM cleaning
        WHERE column_b = cleaning.column_b)
        AS multicleanamount
    FROM cleaning

正在计算每一行,因为它只是将一列与同一列进行比较 - 我明白原因。 所以当前(错误)的结果是

column_a column_b multicleanamount
12 300 7
13 321 7
14 300 7
15 330 7
16 330 7
17 351 7
18 330 7

我现在缺少的是如何告诉子选择与第一行的cleaning.column_b 的当前值进行比较? (在cleaning.*中)

2bh 一开始在我的脑海中很容易,如果我将它与像 '300' 这样的静态值进行比较,但该表有 74 K 条目。这必须是动态的。

我想要的输出是

column_a column_b multicleanamount
12 300 2
13 321 1
14 300 2
15 330 3
16 330 3
17 351 1
18 330 3

我希望这是可以理解的。如果没有,请告诉我,我会尽量详细说明。

【问题讨论】:

  • 感谢您重新格式化@Barmar
  • 是否只是因为表格前后缺少空行?那也应该在预览中实现。在我发布问题之前它已正确显示。
  • 我想你找到了一个功能

标签: mysql sql select count


【解决方案1】:

使用表别名,以便您可以将子查询中的 cleaning 表与主查询中的表区分开来。在您的查询中,WHERE column_b = cleaning.column_b 将列与自身进行比较,因此条件始终为真,并且您正在计算所有行。

SELECT c1.*,
    (SELECT COUNT(*)
        FROM cleaning AS c2
        WHERE c1.column_b = c2.column_b)
        AS multicleanamount
FROM cleaning AS c1

最好将其写成JOIN,而不是相关子查询:

SELECT c1.*, c2.multicleanamount
FROM cleaning AS c1
JOIN (
    SELECT column_b, COUNT(*) AS multicleanamount
    FROM cleaning
    GROUP BY column_b
) AS c2 ON c1.column_b = c2.column_b

【讨论】:

  • 我能否在最后添加一个过滤器,以便检查 >1 的行?看来我不能简单地添加WHERE multicleanamount >1,因为在这种情况下它不是有效的参考。
  • 您可以在子查询中使用HAVING multicleanamount > 1或在主查询中使用WHERE multicleanamount > 1
  • 我在该评论之前的初始尝试是主查询中的WHERE [...] AND multicleanamount > 1。但结果只是显示multicleanamount 是一个未知列。子查询中的HAVING multicleanamount > 1 导致Reference "multicleanamount" not supported
  • 我说的是第二个版本,JOIN
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 2013-04-05
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
相关资源
最近更新 更多