SQL连接:带有顺序的组

时间:2015-11-17 20:06:40

标签: mysql sql join

我有一个包含4个表的数据库,如下所示:

USER table:
 * id: INTEGER, AUTO INCREMENT...
 * name: VARCHAR

PRODUCT table:
 * id: INTEGER, AUTO INCREMENT...
 * name: VARCHAR


ORDER table:
 * id: INTEGER, AUTO INCREMENT...
 * number: VARCHAR
 * user_id: FOREIGN KEY to USER table
 * date_created: DATETIME

ORDER_TO_PRODUCT table:
 * order_id: FOREIGN KEY to ORDER table
 * product_id: FOREIGN KEY to PRODUCT table
 * quantity: INTEGER

我想创建一个查询,列出所有用户,每个用户都有最后一个订单(根据order.date_created)日期和编号。

我的想法是按用户对所有结果进行分组(为每个用户创建一行),然后按订单日期排序。但是,这似乎不起作用:

SELECT u.name, o.date_created, o.number
FROM order o
INNER JOIN user u ON o.user_id = u.id
GROUP BY o.user_id
ORDER BY o.created DESC

问题是 - 我做错了吗?是否可以实现没有子查询的目标

1 个答案:

答案 0 :(得分:2)

您的查询需要知道如何处理u.nameo.date_createdo.number。仅ORDER BY是不够的。您目前可以在没有汇总功能的情况下解决的唯一字段为o.user_id,因为这是您的GROUP BY

要查找最后一个订单,通常需要使用像PARTITION OVER这样的窗口函数。但如果您的date_created和数字是自然排序的,您也可以使用简单的MAX

SELECT o.user_id, MAX(u.name), MAX(o.date_created), MAX(o.number) FROM order o INNER JOIN user u ON o.user_id = u.id GROUP BY o.user_id

否则请查看本文档中的Window函数:http://www.postgresql.org/docs/9.5/static/tutorial-window.html