mysql - SQL 连接 : group with order

标签 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

问题是 - 我做错了吗?是否有可能在没有子查询的情况下实现目标?

最佳答案

您的查询需要知道如何处理 u.nameo.date_createdo.numberORDER 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/

相关文章:

mysql - 在子查询中使用父字段

mysql - Apache时间和MySQL异步时间

javascript - 判断checkbox是否有变化

sql - Postgresql并发索引

sql - 如何使用 CASE 语句在 SQL Server 中创建数据透视查询?

mysql - 连接多个表?

SQL JOIN 多部分标识符错误

mysql - 这个简单的 MySQL SELECT 查询有什么问题?

php - 通过IP地址识别用户位置

sql - 将表与行连接起来