我有一个包含 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
问题是 - 我做错了吗?是否有可能在没有子查询的情况下实现目标?
最佳答案
您的查询需要知道如何处理 u.name
、o.date_created
和 o.number
。 ORDER BY
是不够的。您当前可以在没有聚合函数的情况下处理的唯一字段是 o.user_id
,因为这是您的 GROUP BY
。
要找到最后的订单,您通常需要使用 Window 函数,例如 PARTITION OVER
。但是如果你的 date_created 和 number 是自然排序的,你也可以使用简单的 MAX
SELECT o.user_id, MAX(u.name), MAX(o.date_created), MAX(o.number)
FROM 订单 o
INNER JOIN user u ON o.user_id = u.id
GROUP BY o.user_id
否则请查看此文档以了解窗口函数:http://www.postgresql.org/docs/9.5/static/tutorial-window.html
关于mysql - SQL 连接 : group with order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33766001/