多个内部联接会添加额外的值来计算

hel*_*llo 3 mysql sql pivot

我试图在下面的多个连接中包含上一个查询中其他表的结果:

SELECT mid                             as mID,
   round((x.qty_sum / x.qty_count), 5) as qtAVG,
   round(x.qty_stddev, 5)              as qtSTDDEV,
   x.qty_count                         as qtCOUNT,
   round((x.rel_sum / x.rel_count), 5) as relAVG,
   round(x.rel_stddev, 5)              as relSTDDEV,
   x.rel_count                         as relCOUNT,
FROM (SELECT t.mid,
         SUM( mt = 'qt' )   as qty_count,
         SUM(CASE WHEN t_r.mt = 'qt' THEN rt END)  as qty_sum,
         STD(CASE WHEN t_r.mt = 'qt' THEN rt END)  as qty_stddev,
         SUM( t_r.mt = 'rel' ) as rel_count,
         SUM(CASE WHEN t_r.mt = 'rel' THEN rel END) as rel_sum,
         STD(CASE WHEN t_r.mt = 'rel' THEN rel END) as rel_stddev
  FROM t_r r
right join t_m t on t.mid = r.mid
right join m_k m on m.mid = t.mid
right join k_d k on m.kid = k.kid
  GROUP BY t.mid
 ) x;
Run Code Online (Sandbox Code Playgroud)

用我上面的查询,qty_count111mtqt回报6,而不是2.2 * (count of 111 in table m_k)

当我删除的加入这部分,我得到了想要的金额qtCOUNTrelCOUNT

right join m_k m on m.mid = t.mid
right join k_d k on m.kid = k.kid
Run Code Online (Sandbox Code Playgroud)

我做错了什么,我该如何解决?

数据:

m_k

mid  kid
--------
109  2
110  2
110  4
111  1
111  2
111  3
Run Code Online (Sandbox Code Playgroud)

K_D

kid  k_desc
-----------
1    desc1
2    desc2
3    desc3
4    desc4
Run Code Online (Sandbox Code Playgroud)

M_D

mid  col1   col2   col3   col4
-------------------------------
109  val_a  val_d  val_g  val_j
110  val_b  val_e  val_h  val_k
111  val_c  val_f  val_i  val_l
Run Code Online (Sandbox Code Playgroud)

T_R

mid  rt  stamp                  mt
----------------------------------
111  3   2018-12-08 01:30:31   rel
111  4   2018-12-08 03:41:56   qt
111  3   2018-12-08 02:29:10   qt
110  1   2018-12-08 06:13:51   rel
110  5   2018-12-08 11:44:39   qt
109  1   2018-12-08 10:39:51   rel
Run Code Online (Sandbox Code Playgroud)

其他与上述相同的查询都可以.

hel*_*llo 7

我通过移动解决了这个问题

right join m_k m on m.mid = t.mid
right join k_d k on m.kid = k.kid
Run Code Online (Sandbox Code Playgroud)

在派生表之外x.最终查询如下所示:

SELECT mid                             as mID,
   round((x.qty_sum / x.qty_count), 5) as qtAVG,
   round(x.qty_stddev, 5)              as qtSTDDEV,
   x.qty_count                         as qtCOUNT,
   round((x.rel_sum / x.rel_count), 5) as relAVG,
   round(x.rel_stddev, 5)              as relSTDDEV,
   x.rel_count                         as relCOUNT,
FROM (SELECT mid,
         SUM( mt = 'qt' )   as qty_count,
         SUM(CASE WHEN mt = 'qt' THEN rt END)  as qty_sum,
         STD(CASE WHEN mt = 'qt' THEN rt END)  as qty_stddev,
         SUM( mt = 'rel' ) as rel_count,
         SUM(CASE WHEN mt = 'rel' THEN rel END) as rel_sum,
         STD(CASE WHEN mt = 'rel' THEN rel END) as rel_stddev
  FROM t_r r
right join t_m t on t.mid = r.mid
  GROUP BY mid
 ) x
right join m_k m on m.mid = x.mid
right join k_d k on k.kid = m.kid
group by m.mid;
Run Code Online (Sandbox Code Playgroud)