仅获取多对多关系的最近日期的结果
Get only result for most recent date on many to many relationship
我有 3 个表 :
购买请求 - 有列 - id, name
Order_purchase_request - 有列 - order_id、purchase_request_id(多对多 link)
Orders - 有列 - id, name, ordered_on
Purchase requests table
1| A
2| B
3| C
Orders table
1| XYZ | 2020-10-28 00:00
2| PQR | 2020-10-27 00:00
3| ABC | 2020-10-29 00:00
4| DEF | 2020-10-29 00:00
5| GHI | 2020-10-30 00:00
Order_purchase_request
1|1
2|1
3|3
4|2
5|2
5|3
我希望 SQL 查询 return 具有最高订单日期的采购请求
结果集应该类似于 -
purchase_request_id|Order Name|Ordered on
1 | XYZ | 2020-10-28 00:00
2 | GHI | 2020-10-30 00:00
3 | GHI | 2020-10-30 00:00
下面是我写的SQL。但它 return 给我所有的行。有什么问题吗?
SELECT p.id, p.purchase_request_name, o.ordered_on
from purchase_requests p
JOIN order_purchase_request opr
on p.id = opr.purchase_request_id
JOIN orders o on opr.order_id = o.id
WHERE o.id = (SELECT o.id
FROM ???
WHERE o.id = apr.amazon_purchase_order_id
ORDER BY o.id DESC LIMIT 1)
ORDER BY purchase_request_name DESC;
我正在使用 MariaDB。
您可以使用 window 函数:
SELECT *
FROM (
SELECT p.id, p.purchase_request_name, o.ordered_on,
RANK() OVER(PARTITION BY p.id ORDER BY o.ordered_on DESC) rn
FROM purchase_requests p
JOIN order_purchase_request opr ON p.id = opr.purchase_request_id
JOIN orders o ON opr.order_id = o.id
) t
WHERE rn = 1
ORDER BY purchase_request_name DESC;
我有 3 个表 :
购买请求 - 有列 - id, name
Order_purchase_request - 有列 - order_id、purchase_request_id(多对多 link)
Orders - 有列 - id, name, ordered_on
Purchase requests table
1| A
2| B
3| C
Orders table
1| XYZ | 2020-10-28 00:00
2| PQR | 2020-10-27 00:00
3| ABC | 2020-10-29 00:00
4| DEF | 2020-10-29 00:00
5| GHI | 2020-10-30 00:00
Order_purchase_request
1|1
2|1
3|3
4|2
5|2
5|3
我希望 SQL 查询 return 具有最高订单日期的采购请求
结果集应该类似于 -
purchase_request_id|Order Name|Ordered on
1 | XYZ | 2020-10-28 00:00
2 | GHI | 2020-10-30 00:00
3 | GHI | 2020-10-30 00:00
下面是我写的SQL。但它 return 给我所有的行。有什么问题吗?
SELECT p.id, p.purchase_request_name, o.ordered_on
from purchase_requests p
JOIN order_purchase_request opr
on p.id = opr.purchase_request_id
JOIN orders o on opr.order_id = o.id
WHERE o.id = (SELECT o.id
FROM ???
WHERE o.id = apr.amazon_purchase_order_id
ORDER BY o.id DESC LIMIT 1)
ORDER BY purchase_request_name DESC;
我正在使用 MariaDB。
您可以使用 window 函数:
SELECT *
FROM (
SELECT p.id, p.purchase_request_name, o.ordered_on,
RANK() OVER(PARTITION BY p.id ORDER BY o.ordered_on DESC) rn
FROM purchase_requests p
JOIN order_purchase_request opr ON p.id = opr.purchase_request_id
JOIN orders o ON opr.order_id = o.id
) t
WHERE rn = 1
ORDER BY purchase_request_name DESC;