如何为特定值添加计数列(如 sub-select)

How to add a counting column for specific values (as sub-select)

我有一个要添加列的查询。它应该包含特定列的值在 table.

中出现的次数

我目前的尝试

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

我现在缺少的是如何告诉 sub-Select 从第一行开始与 cleaning.column_b 的当前值进行比较? (在cleaning.*

2bh 一开始我脑子里很容易,如果我将它与 '300' 这样的静态值进行比较,但 table 有 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

我希望这是可以理解的。如果不是请告诉我,我会尝试详细说明。

使用 table 别名,以便您可以区分子查询中的 cleaning table 和主查询中的 table。在您的查询中,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