【问题标题】:Count with a subselect yielding double the amount使用子选择进行计数,产生双倍的金额
【发布时间】:2023-03-08 16:27:01
【问题描述】:

我是 SQL 新手。

问题:假设我将“x”COUNT(x.xValue) 的别名表中包含的数量计算为 217。现在当我添加子查询“y”和然后再次计数,我有COUNT(x.xValue) 突然平方它的自我 -> 47089。为什么会发生这种情况?

(注意:别名表“x”和“y”的数量相同 -> 217。)

我该如何解决这个问题。我不想使用变量或视图。

SELECT COUNT(x.xValue) + COUNT(y.yValue) AS CountXY
FROM 
(SELECT value AS xValue FROM table1
            WHERE 
            ...) AS x,
(SELECT value AS yValue FROM table1 
            WHERE 
            ...) AS y

“CountXY”的结果:94178。

我期待 'CountXY' 的结果:434

【问题讨论】:

  • 您在那里写的内容称为 theta-join 或“旧的连接方式”。表x 的每一行都将连接到表y 的每一行。如果两个表都包含 217 行,你会得到你所说的x * y。由于在您的情况下 x 和 y 都是 217,因此您得到 217 的平方。您真正想要的是 SELECT (SELECT COUNT(*) FROM table1 WHERE..) + (SELECT COUNT(*) FROM table2 WHERE..) AS my_total_count)

标签: mysql count subquery


【解决方案1】:

问题是您正在执行两个子查询,然后尝试直接调用值返回。

这将表现为从表x 中选择一个值并将其与表y 中的每个值匹配。这显然会产生 平方回报 效果。

您需要使用JOIN 来组合两个数据集,以便获得您想要实现的1 to 1 关系。

这就是您之前的子查询应该如何完成上述操作:

SELECT COUNT(A.value) AS x, COUNT(B.value) AS y
FROM table1 AS A
    JOIN table1 AS B
        ON A.attr1 = B.attr1
        AND A.attr2 = B.attr2
    WHERE B.attr1 != 'whatever'
    AND B.attr2 = 'whatever'
    AND A.attr3 = 'something'
    AND B.attr3 = 'something different'

上述查询应返回您正在寻找的正确1 to 1 关系。用上面的子查询替换你的子查询应该会给你正确的答案

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2012-06-21
    • 2023-04-08
    • 1970-01-01
    • 2018-03-21
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多