【问题标题】:Getting a record with a MAX value across several join tables跨多个连接表获取具有 MAX 值的记录
【发布时间】:2021-08-08 05:12:10
【问题描述】:

架构:

目标(假设此架构必须保持不变):

每家公司创建的第一个销售人员最近的外展活动是什么?

  1. 对于 company 表中的每条记录,使用匹配的 company_salesperson.customer_id 值和 MAX(company_salesperson.created_at) 值获取 company_salesperson 表中的相应记录。
  • {对于带有 id == 1 的公司记录:这应该返回带有 id == 2 的 company_salesperson 记录}
  1. 对于每条返回的 company_salesperson 记录,获取具有匹配 company_salesperson_company_outreach.company_salesperson_id 值的所有 company_salesperson_company_outreach 记录
  • 对于带有 id == 2 的 company_salesperson 记录,这应该返回两个带有 id 2 和 3 的 company_salesperson_company_outreach 记录
  1. 对于每组返回的company_salesperson_company_outreach记录,获取MAX(company_outreach.outreach_id)对应的company_outreach记录
  • 对于 ID 为 2 和 3 的 company_salesperson_company_outreach 记录,我们应该得到相应的 ID 为 2 和 3 的 company_outreach 记录。根据它们的 company_outreach.outreach_id 值,这应该看到带有 id == 3 的 company_outreach 记录具有更大company_outreach.outreach_id 值。因此,这应该返回带有 id == 3 的 company_salesperson_company_outreach 记录。

期望的输出:

SELECT company.id, company_salesperson.id, company_salesperson_company_outreach.id, company_outreach.id
FROM ...???
company.id company_salesperson.id company_salesperson_company_outreach.id company_outreach.id
1 2 3 3

我觉得有一个非常优雅的解决方案,但是在我的大脑从耳朵里融化了三天之后,我被建议伸手到这里!感谢您的宝贵时间。

【问题讨论】:

    标签: mysql sql schema


    【解决方案1】:

    我认为您应该能够通过使用嵌套子查询来获得此结果,例如:

    SELECT c.company_id,
      csco.company_salesperson_id,
      csco.id,
      c.outreach_id
    FROM company_outreach c
      INNER JOIN company_salesperson_company_outreach csco
        on c.id = csco.company_outreach_id
    WHERE c.Id = (
      SELECT MAX(company_outreach_id)
      FROM company_salesperson_company_outreach
      WHERE company_salesperson_id = (
        SELECT MIN(id)
        FROM company_salesperson
        WHERE company_id = c.company_id
        AND created_at = (
          SELECT MIN(created_at)
          FROM company_salesperson
          WHERE company_id = c.company_id
        ) 
      )
    )
    

    感觉不像你要求的那样“非常优雅”,但这是我能想到的最好的了。

    【讨论】:

    • 你这该死的摇滚翁贝托!非常感谢您的回复,它比我之前的工作要优雅得多。我现在就试一试!
    • 我刚试过这个,它基本上不会运行。我认为逻辑是可靠的,并且我理解您的方法,但是数据集可能太大而无法运行此查询。在我停止查询之前,第一次测试用了大约 8 分钟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多