我正在尝试获取并显示包含当前状态的订单列表。
@orders = Order.joins(order_status_details: :order_status)
.order('id DESC, order_status_details.created_at DESC')
.select("orders.id, order_status_details.status_id, order_statuses.name, order_status_details.created_at")
它工作正常,但返回所有行的订单ID重复,如下所示:
+----+-----------+----------------------+---------------------+
| id | status_id | name | created_at |
+----+-----------+----------------------+---------------------+
| 8 | 1 | Pending | 2016-01-31 16:33:30 |
| 7 | 3 | Shipped | 2016-02-01 05:01:21 |
| 7 | 2 | Pending for shipping | 2016-01-31 05:01:21 |
| 7 | 1 | Pending | 2016-01-31 04:01:21 |
+----+-----------+----------------------+---------------------+
正确的答案必须返回唯一的ID,因为上面的示例应该是第一行和第二行。
我已经尝试使用distinct on select
,.distinct
,.uniq
和.group
,但我收到了错误。
感谢。
答案 0 :(得分:1)
首先,我相信你的模型是" Order
有很多OrderStatusDetail
"。这就是为什么你的结果中有几个不同的name
的原因。
因此您可以像这样修改查询:
@orders = Order.joins(order_status_details: :order_status)
.order('id DESC, order_status_details.created_at DESC')
.where('order_status_details.id IN (SELECT MAX(id) FROM order_status_details GROUP BY order_id)')
.select("orders.id, order_status_details.status_id, order_statuses.name, order_status_details.created_at")
理想情况下,where
条件仅用于选择order_status_details
的预期ID,例如,我使用min_id
,您可以根据需要进行修改