【问题标题】:Joining a table modified based on another table values with that table in MySQL将基于另一个表值修改的表与 MySQL 中的该表连接起来
【发布时间】:2021-01-18 17:15:50
【问题描述】:

对于以下问题,我需要一些有关 MySQL 查询的帮助。

我有两个表 A (id, ref_id) 和 B (ref_id (primary key), class, pulse),其中 A.ref_id 存在于 B.ref_id 中。 ref_id 是从 1 开始的整数值,是 B 的 P_k。

A.id | A.ref_id
  1  |  2
  2  |  3
B.ref_id | B.pulse | B.class
     1   |  100    | X
     2   |  50     | Y
     3   |  100    | X

我想要做的是创建一个表,其中所有脉冲值的总和对应于所有 B.ref_id 小于 A.ref_id。此外,仅应考虑其 B.class 与从 A.ref_id 引用的 B.ref_id 的 B.class 相同的那些脉冲。例如,

A.ref_id | sum
  2      | 50
  3      | 200

在此示例中,值为 2 的 A.ref_id 指的是相应的 B.ref_id,因此具有 B.class Y。因为我想要所有 B.ref_id

有人可以帮我解决这个问题吗?

我在 MySQL 中需要一些类似的东西:

SELECT A.ref_id, sum 
FROM A
JOIN (SELECT class, SUM(B.pulse) as sum 
      FROM B WHERE B.ref_id<=A.ref_id 
      GROUP BY B.class) t
ON t.class= (SELECT class FROM B WHERE B.ref_id=A.ref_id)

上述方法不起作用,因为我无法在子查询 (t) 中引用 A.ref_id。没有这个条件的加入对我想做的事情没有帮助。

谢谢!!

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    您可以通过将 B 的 2 个副本连接到 A 来做到这一点:

    SELECT a.ref_id, 
           SUM(b2.pulse) `sum`
    FROM TableA a 
    INNER JOIN TableB b1 ON b1.ref_id = a.ref_id
    INNER JOIN TableB b2 ON b2.ref_id <= b1.ref_id AND b2.class = b1.class
    GROUP BY a.ref_id
    

    请参阅demo。
    结果:

    ref_id sum
    2 50
    3 200

    【讨论】:

      【解决方案2】:

      您可以使用相关子查询:

      select a.*,
             (select sum(b2.pulse)
              from b2
              where b2.class = b.class and
                    b2.ref_id <= a.ref_id
             )
      from a join
           b
           on a.ref_id = b.ref_id;
      

      或者,使用带有join的窗口函数:

      select a.*, b.pulse_sum           
      from a join
           (select b.*, 
                   sum(pulse) over (partition by class order by ref_id) as pulse_sum
            from b
           ) b
           on a.ref_id = b.ref_id;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        相关资源
        最近更新 更多