【问题标题】:SELECT with INNER JOIN to count delta and filter resultsSELECT with INNER JOIN 计算增量和过滤结果
【发布时间】:2020-01-28 22:05:09
【问题描述】:

我正在尝试从表 B 中选择具有相同 id 的所有行,并计算表 Acount 值的增量以及从 B 中选择的行数,如下所示:

SELECT A.id, 
       A.count, 
       count(*) AS counter, 
       CAST(count(*) AS SIGNED) - CAST(A.count AS SIGNED) AS delta 
FROM table_A AS A 
INNER JOIN table_B AS B ON B.id = A.id 
GROUP BY A.id

现在我计算了delta,但无法过滤delta > 0 的结果 我试图在这里和那里放置HAVING delta > 0WHERE delta > 0,但没有运气。看起来我在查询中遗漏了一些与范围有关的内容。

【问题讨论】:

标签: mysql inner-join having-clause


【解决方案1】:

尝试使用此查询

SELECT * FROM (SELECT A.id, 
   A.count, 
   count(1) AS counter, 
   CAST(count(1) AS SIGNED) - CAST(A.count AS SIGNED) AS delta 
FROM table_A AS A 
INNER JOIN table_B AS B ON B.id = A.id 
GROUP BY A.id) as t where delta > 0

【讨论】:

    【解决方案2】:

    这是你想要的吗?

    SELECT
        a.id, 
        a.count, 
        COUNT(*) AS counter
    FROM cdb_A a
    INNER JOIN db_B AS B
        ON b.id = a.id
    GROUP BY
        a.id
    HAVING
        COUNT(*) > a.count;
    

    【讨论】:

    • 看起来在这种情况下最后一个COUNT(*) 试图在每行选择时计算table_B 中的所有行,即使我有LIMIT 1,这个查询也需要无限时间才能完成
    • 性能与您上面的问题似乎不同。
    • 我的意思是这个 count(*) 将计算 table_b 中的总行数,而不仅仅是 b.id = a.id 的行数
    • 实际上,它不会做任何一个。它将计算 A 表中每个 id 记录所连接的记录数。
    • 你说得对,在这里我的测试数据库上工作正常......现在我需要找到优化这个请求的方法
    猜你喜欢
    • 2021-08-05
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多