代码之家  ›  专栏  ›  技术社区  ›  Zoltan

左联接+排序依据,然后分组依据[重复]

  •  0
  • Zoltan  · 技术社区  · 6 年前

    我有两张桌子:公司和电子邮件。

    我想选择每家公司的最后一封电子邮件

    我试过这个:

    SELECT * 
      FROM companies 
      LEFT 
      JOIN emails 
        ON companies.company_id = emails.company_id 
     WHERE companies.status = 'active' 
     GROUP 
        BY emails.company_id 
     ORDER  
        BY emails.date DESC;
    

    但这行不通,按部分排序应该在某种程度上先于按部分分组,因为我想得到每家公司的最后一封电子邮件,而不是对最终结果排序。

    有人能帮我吗?

    谢谢

    使现代化

    我最终做到了:

    SELECT * 
      FROM companies 
      LEFT 
      JOIN (
           SELECT company_id, date
             FROM emails 
            ORDER
               BY date DESC
           ) emails
         ON companies.company_id = emails.company_id 
      WHERE companies.status = 'active' 
      GROUP 
         BY emails.company_id;
    

    谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Thorsten Kettner    6 年前

    如果我以正确的方式理解你的问题,我想这样的事情可以奏效。

    SELECT * FROM companies c 
    LEFT JOIN emails e ON c.company_id = e.company_id
    AND (e.company_id, e.date) IN (
        SELECT company_id, max(date) FROM emails GROUP BY company_id
    )
    WHERE c.status = 'active';
    

    编辑:使用Thorsten答案更新