在MySQL语句中对分组行进行排序

时间:2012-05-19 11:54:32

标签: mysql join group-by sql-order-by

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

customers

  • id(int)
  • name(string)
  • ...

orders

  • id(int)
  • customerID(int)
  • 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

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

Read this question for more information

如提及的问题所述,至少有两种方法可以解决这个问题。选择最安全,最简单的那个。

答案 2 :(得分:1)

你应该做一个subselect,做你的加入,但把分组拿走,然后把这个加入你的

 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