【问题标题】:MySQL - Join order number of latest order based on timestampMySQL - 根据时间戳加入最新订单的订单号
【发布时间】:2016-01-22 16:27:12
【问题描述】:

我从customers 表中选择一位客户,并尝试从jobs 表中获取该客户的最新订单号,但基于该表中不同的时间戳列。

客户

id  |  name | ...

工作

id  | customer_id  |  order_id | assigned
----------------------------------------------------
1   | 985          |  8020     | 2015-12-03 00:00:00
2   | 985          |  4567     | 2015-04-19 00:00:00
3   | 985          |  9390     | 2016-20-01 00:00:00
4   | 985          |  6381     | 2015-08-26 00:00:00

应该加入的最新order_id9390,因为assigned时间戳是最新的。

SQL

SELECT c.name, j.latest_order
FROM customers c
LEFT JOIN (
    SELECT customer_id,
           ??? AS latest_order
    FROM jobs
    WHERE withdrawn IS NULL
    GROUP BY customer_id
) j ON j.customer_id = c.id
WHERE c.id = 985

我真的不知道在子查询中获取latest_order 的最佳方法,但对于该客户来说,它应该是jobs.order_id where jobs.assigned = MAX(jobs.assigned)

【问题讨论】:

  • 您想要一张包含所有客户及其最新订单的表格,还是只针对特定一个
  • @OscarAnthony 只是一个特定的。我总是知道我想要的客户 ID。
  • 好的。然后只需对客户的订单进行排序并拿走第一个。

标签: mysql sql


【解决方案1】:

使用另一个派生表来获取最新订单的订单号。

SELECT c.name, t.order_id, j.latest_order
FROM customers c
JOIN (
    SELECT customer_id,
           max(assigned) AS latest_order
    FROM jobs
    WHERE withdrawn IS NULL
    GROUP BY customer_id
) j ON j.customer_id = c.id 
JOIN (select customer_id, order_id, assinged 
      from jobs 
      where withdrawn is null) t
    ON t.customer_id = j.customer_id and t.assigned = j.latest_order
WHERE c.id = 985

【讨论】:

  • 有道理。这是唯一或最有效的方法吗?
  • 没有。另一种方法是,如果没有where withdrawn is null 条件,您可以只使用jobsjoin
  • 您也可以通过对特定客户的订单进行排序(因为您已经知道他的 ID)并获取第一个(最近的)订单。
【解决方案2】:

我不确定这是否是最快的方法,但也许您想尝试对替代答案进行解释以比较两种性能:

SELECT c.name, j.latest_order
FROM customers c
LEFT JOIN (
  SELECT j1.customer_id, j1.order_id 
  FROM jobs j1 
  JOIN (
    SELECT customer_id, max(assigned) as maxassigned
    FROM jobs j2
    WHERE withdrawn IS NULL
    GROUP BY customer_id
  ) j2
  ON j1.customer_id = j2.customer_id and j1.assigned = j2.maxassigned) j
ON j.customer_id = c.id
AND c.id = 985;

【讨论】:

    【解决方案3】:

    由于您已经知道 customer_id,您可以通过更简单、更短的方式实现此目的。您只需选择该客户的所有订单,按日期排序并仅返回第一条记录。

    这里是查询:

    SELECT r.name, r.order, r.assigned
    FROM (
        SELECT c.name AS name, j.order_id AS order, j.assigned AS assigned
        FROM customer c
        INNER JOIN jobs j
        ON AND c.id = j.customer_id
        WHERE c.id = 985 AND j.withdrawn IS NULL) r
    ORDER BY r.assigned DESC
    LIMIT 1
    

    【讨论】:

      猜你喜欢
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      相关资源
      最近更新 更多