0

我有一个具有以下结构的 MySQL 数据库:

customers

  • 标识(整数)
  • 名称(字符串)
  • ...

orders

  • 标识(整数)
  • 客户 ID(整数)
  • timestamp_unix (int)
  • 标题

现在我想选择所有客户以及他们的最新订单。我尝试了以下语句:

SELECT a.id, a.name, b.timestamp_unix, b.title FROM customers AS a JOIN orders AS b ON a.id = b.customerID GROUP BY a.id

这很好用,除了我没有得到最新的订单(及其标题),而是第一个作为第一个插入数据库的订单。

那么我怎样才能得到最新的订单(最高id和最高timestamp_unix)?仅对于时间戳,我可以使用MAX(b.timestamp_unix)但如何获得匹配b.title

谢谢!

4

3 回答 3

3

你可以试试这个,我已经测试过了。

SELECT a.name as 'Customer Name', b.title as 'Order Title' FROM customers a, orders b where a.id=b.customerID AND b.timestamp_unix=(Select max(c.timestamp_unix) from orders c where c.customerID=a.id) GROUP BY a.id

于 2012-05-19T15:40:41.890 回答
2
SELECT a.id, a.name, b.timestamp_unix, b.title 
FROM customers AS a 
JOIN (  SELECT customerID, timestamp_unix, title
        FROM orders
        ORDER BY timestamp_unix DESC) AS b
ON a.id = b.customerID 
GROUP BY a.id
ORDER BY timestamp_unix DESC

阅读此问题以获取更多信息

正如在提到的问题中提到的,至少有两种方法可以解决这个问题。选择您认为最安全和最简单的一种。

于 2012-05-19T12:03:47.483 回答
1

你应该做一个子选择,做你的加入,但把分组拿走,然后把它变成你加入的东西

 Left join (select orderid from orders where customerid = A.customerid order by orderdate desc limit 1) as lastorder

我想更清楚,但我在我的手机上哈哈

我现在在我的电脑上,这是一个 MSSQL 小提琴来展示它 - 只需转换为 Mysql (语法应该相同,除了 TOP 1 应该是最后的 LIMIT 1 )

http://sqlfiddle.com/#!3/29a3c/13

于 2012-05-19T12:04:26.920 回答