我有一个包含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
问题是 - 我做错了吗?是否可以实现没有子查询的目标?
答案 0 :(得分:2)
您的查询需要知道如何处理u.name
,o.date_created
和o.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