【问题标题】:MySQL left join COUNT() and SUM() with CASE from same tableMySQL 将 COUNT() 和 SUM() 与来自同一个表的 CASE 左连接
【发布时间】:2014-08-06 21:23:12
【问题描述】:

我在一系列一对多关系中有以下表格:

company_company、company_portfolio、building_site 和 statistics_meter。我遇到的困难领域是决赛桌,statistics_meter。

为了方便本练习,其结构如下:

记录在同一个表中是相关的,有些是父仪表,有些是子仪表。如果记录是子记录,它将设置 parent_meter_id,而 building_id,至关重要的是,表是如何 LEFT JOIN'ed 设置为 NULL。

 id  | parent_meter_id | site_ref            | building_id
 1   | NULL            | some building       | 45
 2   | NULL            | some other building | 45
 3   | 1               | and another         | NULL
 4   | 1               | one another one     | NULL
 5   | 2               | final one           | NULL

我有两个要求:

1 - 计算设置了 building_id 的父仪表的数量(我正在成功)

2 - 计算 parent_meter_id 与 (1) 中计数的meter_id 匹配的仪表数

因此,我希望得到 (1) = 2 和 (2) = 3 的结果。

这是迄今为止我得到的 SQL...我尝试摆弄 SUM 案例,但我认为这是完全错误的。这甚至可以在一个查询中实现吗?

感谢您的帮助。

        SELECT
        building_site.id as site_id,
        building_site.site_ref as building_name,
        COUNT(statistics_meter.id) AS meter_count,
        SUM(CASE WHEN statistics_meter.parent_meter_id = [???] THEN 1 ELSE 0 END) AS check_meter_count
        FROM company_company
        LEFT JOIN company_portfolio ON company_portfolio.company_id=company_company.id
        LEFT JOIN building_site ON building_site.portfolio_id=company_portfolio.id
        LEFT JOIN statistics_meter ON statistics_meter.building_id=building_site.id
        WHERE company_company.id=41
        GROUP BY building_site.id

【问题讨论】:

    标签: mysql sql join count sum


    【解决方案1】:

    好吧,如果我理解您的意思,您需要使用子查询来获取带有建筑物 ID 的父计量表,然后将其连接到您的主表中。 SQL Fiddle

    select
    sm.id,
    sm.parent_meter_id,
    sm2.id as ID2,
    sm.site_ref,
    sm.building_id
    from
    statistics_meter sm
    inner join (
      select
      id,
      parent_meter_id
      from
      statistics_meter
      where
      building_id is not null) sm2
      on sm.parent_meter_id = sm2.id
    

    【讨论】:

    • 感谢您的回答。在我的问题中,我指定我需要两个不同的结果计数。我可以在这个子查询解决方案中使用计数吗?
    • 我不明白为什么不这样做。你到底要数什么?
    • 我把它放在问题中。这里是为了方便:我有两个要求:1 - 计算设置了 building_id 的父仪表的数量(我正在成功完成) 2 - 计算 parent_meter_id 与计入的仪表 ID 匹配的仪表数量(1 )
    • 谢谢,接近我要找的东西。但是我希望在相同的查询中满足我的两个要求并获得两个计数......例如从示例数据中,对于建筑物 id=45 的那些获得“2”的计数结果,并为它的子仪表获得“3”的计数结果(您在上一个 SQL Fiddle 中正确地完成了后者)。感谢您的帮助。
    • 好的,其实我自己排序的,看我的回答。
    【解决方案2】:

    不确定这是否是最有效的方法,但最后我执行了如下所示的左连接和子查询并执行了两次计数,一个 COUNT() 用于回答我的要求 (2) 的总数和一个COUNT(distinct) 来回答我的要求 (1)

            SELECT
            count(distinct statistics_meter.id) as meter_count,
            count(statistics_meter.id) as check_meter_count
            FROM company_company
            LEFT JOIN company_portfolio ON company_portfolio.company_id=company_company.id
            LEFT JOIN building_site ON building_site.portfolio_id=company_portfolio.id
            LEFT JOIN statistics_meter ON statistics_meter.building_id=building_site.id
            LEFT JOIN (select * from statistics_meter where parent_meter_id is not NULL) sm2 on sm2.parent_meter_id = statistics_meter.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-11
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多