【问题标题】:multiple inner joins adds extra values to count多个内连接增加了额外的值来计数
【发布时间】:2018-12-16 05:27:36
【问题描述】:

我正在尝试使用以下多个连接将来自其他表的结果包含在 previous 查询中:

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;

使用我上面的查询,当mtqt 时,qty_count for 111 返回6 而不是22 * (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

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

数据:

m_k

mid  kid
--------
109  2
110  2
110  4
111  1
111  2
111  3

k_d

kid  k_desc
-----------
1    desc1
2    desc2
3    desc3
4    desc4

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

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

实现与上述相同的其他查询也可以。

【问题讨论】:

  • 可能是因为 laravel 标签 ;-)
  • 我们不知道发生了什么——mtmid 在哪个表中?请编辑查询以使其符合条件。
  • 请为每张桌子提供SHOW CREATE TABLE
  • 您提供了表 m_d 的数据(未在您的查询中使用)并省略了表 t_m 的示例数据(您在查询中引用)。没有t_m的数据,很难帮你;因为您没有为表格使用助记符名称,因此必须对丢失的数据做出假设。

标签: mysql sql pivot


【解决方案1】:

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

right join m_k m on m.mid = t.mid
right join k_d k on m.kid = k.kid

在派生表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;

【讨论】:

  • 基本原理:所有JOINing 聚合之前完成(COUNTSUM 等)。所以,一定要在GROUP BY之前只做必要的JOINs
  • 你为什么要右加入m_kk_d?您不会在选择中使用它们。 m.mid 的 Group-By 也是如此 - 您没有在 Select 中使用任何聚合函数来实现这一点。
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2018-05-29
  • 2021-08-27
  • 2019-09-15
  • 2016-05-30
相关资源
最近更新 更多