Mysql 如何找到每个组的最小值并选择整行?

Mysql 如何找到每个组的最小值并选择整行?,mysql,sql,database,Mysql,Sql,Database,我有一个PROJECTS表,其中包含PROJECT\u ID、CUSTOMER\u ID、COMPANY\u ID和COST列。 一个客户可能在不同的公司有一个或多个项目。 我想要的是选择一个为每家公司创造最小收入的客户 例如如果表格如下所示 project_id customer_id company_id cost 1 1 1 1000 2 1 1 100 3

我有一个PROJECTS表,其中包含PROJECT\u ID、CUSTOMER\u ID、COMPANY\u ID和COST列。 一个客户可能在不同的公司有一个或多个项目。 我想要的是选择一个为每家公司创造最小收入的客户

例如如果表格如下所示

project_id customer_id company_id cost
         1           1          1 1000
         2           1          1  100
         3           2          1 3000
         4           1          2  300
         5           2          2  100  
,预期的答案是:

(公司ID)1 |(客户ID)1 |(成本)1100

(公司ID)2 |(客户ID)2 |(成本)100

因为第一个客户总共生成1000+100=1100

我的查询如下所示:

SELECT TABLE1.company_id, TABLE1.customer_id, MIN(profit)

FROM (
            SELECT company_id, customer_id, SUM(projects.cost) AS profit

            FROM projects

            GROUP BY company_id,customer_id

     ) AS TABLE1

GROUP BY TABLE1.company_id;
它计算最小利润,但CUSTOMER\u ID列中的ID总是错误的。如何在客户ID和每家公司的总利润之间建立联系?可能吗


感谢您的帮助。

执行此操作的一种方法是“hack”,因为它使用字符串操作来获取所需的值:

SELECT cc.company_id,
       SUBSTRING_INDEX(GROUP_CONCAT(cc.customer_id ORDER BY profit ASC), ',', 1) as customer_id,
       MIN(profit)
FROM (SELECT p.company_id, p.customer_id, SUM(p.cost) AS profit
      FROM projects p
      GROUP BY p.company_id, p.customer_id
     ) cc
GROUP BY cc.company_id;
MySQL中的另一种选择如下:

SELECT p.company_id, p.customer_id, SUM(p.cost) AS profit
FROM projects p
GROUP BY p.company_id, p.customer_id
HAVING SUM(p.cost) = (SELECT SUM(p2.cost)
                      FROM projects p2
                      WHERE p2.company_id = p.company_id
                      ORDER BY SUM(p2.cost) ASC
                      LIMIT 1
                     );
这两个版本略有不同:

  • 第一个客户将始终返回一个客户,即使有联系
  • 第一个将
    公司id
    转换为字符串
  • 第一个可能会出现溢出情况,因为
    group_concat()
    的中间结果的长度由系统参数控制

使用
拥有
全部

SELECT p.company_id, 
       p.customer_id, 
       SUM(p.cost) AS profit
FROM projects p
GROUP BY p.company_id, p.customer_id
HAVING SUM(p.cost) <= ALL(
   SELECT SUM(p2.cost)
   FROM projects p2
   WHERE p2.company_id = p.company_id
   GROUP BY p2.customer_id
)
选择p.company\u id,
p、 客户识别码,
作为利润的总额(p.成本)
来自项目p
按p.公司id、p.客户id分组
具有总和(p.成本)例如:


将表与当前派生表(也称为子查询)联接
SELECT a.* 
  FROM 
     ( SELECT customer_id
            , company_id
            , SUM(cost) total 
         FROM my_table 
        GROUP 
           BY customer_id
            , company_id
     ) a 
  JOIN 
     ( SELECT company_id
            , MIN(total) min_total 
         FROM 
            ( SELECT customer_id
                   , company_id
                   , SUM(cost) total 
                FROM my_table 
               GROUP 
                  BY customer_id
                   , company_id
            ) x  
        GROUP 
           BY company_id
     ) b 
    ON b.company_id = a.company_id 
   AND b.min_total = a.total;