我想找到最后一次付款(或者NULL
如果不适用)为指定的product_id
. 下面是我正在使用的表的表示(简化版)。
+----------+
|Products |
|----------+
|product_id|
+----------+
+---------------+
|Orders |
+---------------+
|order_id |
|order_timestamp|
|order_status |
+---------------+
+-----------------+
|ProductsOrdersMap|
+-----------------+
|product_id |
|order_id |
+-----------------+
在 JOIN、MAX、GROUP BY、LEFT JOIN、多个 INNER JOIN 以获得最大 n-per-group 之后,我仍然无法得到正确的结果。大多数情况下,具有多个订单的产品会返回多行。到目前为止,我得到的最好结果是(我正在搜索特定产品):
product_id order_id order_timestamp order_status
8 NULL NULL NULL
9 NULL NULL NULL
10 NULL NULL NULL
12 NULL NULL NULL
13 NULL NULL NULL
14 11 2013-08-13 07:22:01 finished
15 11 2013-08-13 07:22:01 finished
15 12 2013-08-14 00:00:00 finished
32 11 2013-08-13 07:22:01 finished
83 9 2013-08-13 07:04:02 finished
83 10 2013-08-13 07:11:42 finished
编辑: PP之后。anwser,我最终得到以下查询:
SELECT p.product_id, o.order_id, MAX(order_timestamp) AS order_timestamp, order_status
FROM Products p LEFT JOIN (ProductsOrdersMap m, Orders o)
ON (p.product_id = m.product_id AND m.order_id = o.order_id)
WHERE p.product_id IN (8,9,10,12,13,14,15,32,83)
GROUP BY p.product_id
哪个返回
product_id order_id order_timestamp order_status
8 NULL NULL NULL
9 NULL NULL NULL
10 NULL NULL NULL
12 NULL NULL NULL
13 NULL NULL NULL
14 11 2013-08-13 07:22:01 finished
15 11 2013-08-13 07:22:01 finished
32 11 2013-08-13 07:22:01 finished
83 9 2013-08-13 07:04:02 finished
乍一看,它似乎是正确的,但只有产品 ID 和时间戳是正确的。比较上面的两个查询,您可以看到,对于产品 15 和 83,order_id
是错误的(order_status
也可能是错误的)。