【问题标题】:MySQL join three queries without multiplying recordsMySQL连接三个查询而不增加记录
【发布时间】:2020-07-23 09:24:47
【问题描述】:

我有三张桌子:

tblUnits [Unit_ID, Country]

tblEvents [Unit_ID, Month, Duration_Hrs]

tblMetrics [Unit_ID, Month, Service_Hrs]

并在其上构建了 3 个查询:

1.

SELECT Unit_ID
FROM tblUnits
WHERE City = 'NewYork'

有输出:

Unit_ID
1
2
3
SELECT
COUNT(IF(Event_Type in ('X', 'Y'), 1, NULL)) as Ev_Count,
SUM(CASE
        WHEN Event_Type in ('X', 'Y') THEN Duration_Hrs
    END) Duration
FROM tblEvents
WHERE
Design = 'GoodDesign'
AND Month = 'May'
AND Unit_ID in (1,2,3)

有输出:

Ev_Count | Duration
1        | 10
SELECT SUM(Service_Hrs) as SumSH
FROM tblMetrics
WHERE Month = 'May'
AND Unit_ID in (1,2,3)

有输出:

SumSH
100

现在我想结合这 3 个查询来获得如下输出:

Ev_Count | Duration | SumSH
1        | 10       | 100

我的带有两个左连接的查询将 tblEvents 和 tblMetrics 值相乘。

【问题讨论】:

  • 你的MySql是什么版本的?
  • MySQL 服务器 5.6.34

标签: mysql join left-join


【解决方案1】:

如果没有额外的行,您将无法加入查询,这将返回错误的聚合,并且由于您的 MySql 版本不支持CTEs,您必须使用运算符IN 使用两次第一个查询:

SELECT
  SUM(Event_Type IN ('X', 'Y')) Ev_Count,
  SUM(CASE WHEN Event_Type IN ('X', 'Y') THEN Duration_Hrs END) Duration,
  (
    SELECT SUM(Service_Hrs)
    FROM tblMetrics
    WHERE Month = 'May'
    AND Unit_ID IN (SELECT Unit_ID FROM tblUnits WHERE City = 'NewYork')
  ) SumSH
FROM tblEvents
WHERE Design = 'GoodDesign' AND Month = 'May' 
AND Unit_ID IN (SELECT Unit_ID FROM tblUnits WHERE City = 'NewYork')

此外,您的聚合列 Ev_CountEvent_Type 都使用条件:

Event_Type IN ('X', 'Y')

那么为什么不在 WHERE 子句中过滤这个条件并避免条件聚合:

SELECT
  COUNT(*) Ev_Count,
  SUM(Duration_Hrs) Duration,
  (
    SELECT SUM(Service_Hrs)
    FROM tblMetrics
    WHERE Month = 'May'
    AND Unit_ID IN (SELECT Unit_ID FROM tblUnits WHERE City = 'NewYork')
  ) SumSH
FROM tblEvents
WHERE Design = 'GoodDesign' AND Month = 'May' 
AND Event_Type IN ('X', 'Y')
AND Unit_ID IN (SELECT Unit_ID FROM tblUnits WHERE City = 'NewYork')

【讨论】:

  • 当我尝试在 SumSH 子查询中再添加一列“SUM(Period_Hrs)”时,出现错误“操作数应包含 1 列”。这是否意味着我需要添加另一个子查询来选择下一列?然后我将不得不使用第一个查询 3 次。
  • 如果子查询仅返回 1 列,则此代码有效。对于更多列,您需要一个 CROSS JOIN。
猜你喜欢
  • 2012-05-02
  • 2013-07-13
  • 2017-03-01
  • 2010-09-26
  • 1970-01-01
  • 2018-12-28
  • 2019-02-26
  • 1970-01-01
  • 2021-07-07
相关资源
最近更新 更多