【问题标题】:Returning count as an additional column返回计数作为附加列
【发布时间】:2020-06-30 01:24:01
【问题描述】:

我对 MySQL 有点陌生,但我不太清楚如何完成此操作:基本上,我有两张表:一张是公司表,一张是位置表。位置表具有公司的外键,因此公司可以有多个位置。我有一个简单的选择查询,它返回公司 ID 和位置 ID,如下所示:

SELECT location.id as location_id, company.id as company_id FROM company 
INNER JOIN location ON (location.company_id = company.id);

我想知道是否有办法将位置数量也作为额外的列返回。它会返回如下内容:

number_of_locations |  company_id | location_id
2 | 1 | 1
2 | 1 | 2
1 | 2 | 3
2 | 4 | 5
2 | 4 | 6

谢谢!

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    这是您预期输出的 SQL -

    解决方案#1 -

    SELECT count(location.id) over (partition by location.company_id) as number_of_locations,
    company.id as company_id,
    location.id as location_id
    FROM company 
    INNER JOIN location ON (location.company_id = company.id);
    

    解决方案#2 -

    SELECT cl.number_of_locations,
    company.id as company_id,
    location.id as location_id
    FROM company 
    INNER JOIN location ON location.company_id = company.id
    INNER JOIN (SELECT count(location.id) as number_of_locations,
    company.id as company_id
    FROM company 
    INNER JOIN location ON location.company_id = company.id GROUP BY company.id) cl
    ON company.id = cl.company_id;
    

    【讨论】:

    • 谢谢!我应该澄清我正在使用 mysql,所以“分区依据”不起作用。你知道替代方案吗?
    • MySQL 8.0 引入了对 MySQL 早期版本所没有的分析窗口函数的支持。所以这意味着您正在开发以前的版本?
    • 请在我的回答中检查解决方案# 2。
    • 谢谢,但cl 来自哪里?
    • 这是我赋予内联视图的别名。
    【解决方案2】:

    只使用窗口函数:

    select t.*, count(*) over (partition by company_id) as number_of_locations
    from t;
    

    【讨论】:

      猜你喜欢
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2014-09-14
      • 2020-07-21
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多