次のスキーマを持つ 3 つのエンティティ (Orders、Items、および OrderItems) があります。
OrderItems
Orders +---------------+
+-----------+ | id (PK) | Items
| id (PK) |==<| order_id (FK) | +-------+
| createdAt | | item_id (FK) |>==| id |
+-----------+ | createdAt | | name |
| quantity | +-------+
+---------------+
OrderItem の履歴を保持する必要があるため、OrderItem の数量が変更された場合に、連続する各変更の元の数量の記録が保持されます。
私の問題は、注文ごとにテーブルから最新のアイテムのみを選択できるようにしたいということです。例えば:
First two (initial) OrderItems:
(id: 1, order_id: 1, item_id: 1, createdAt: 2013-01-12, quantity: 10),
(id: 2, order_id: 1, item_id: 2, createdAt: 2013-01-12, quantity: 10),
Later order items are amended to have different quantities, creating a new row:
(id: 3, order_id: 1, item_id: 1, createdAt: 2013-01-14, quantity: 5),
(id: 4, order_id: 1, item_id: 2, createdAt: 2013-01-14, quantity: 15),
これを行うためのクエリでの私の刺し傷:
SELECT oi.* FROM OrderItems oi
WHERE oi.order_id = 1
GROUP BY oi.item_id
ORDER BY oi.createdAt DESC;
私はこれを生成することを望んでいました:
| id | order_id | item_id | createdAt | quantity |
+----+----------+---------+------------+----------+
| 3 | 1 | 1 | 2013-01-14 | 5 |
| 4 | 2 | 2 | 2013-01-14 | 15 |
実際にこれを作成しました:
| id | order_id | item_id | createdAt | quantity |
+----+----------+---------+------------+----------+
| 1 | 1 | 1 | 2013-01-12 | 10 |
| 2 | 2 | 2 | 2013-01-12 | 10 |
現時点では、createdAt タイムスタンプを使用するだけでアイテムの履歴を特定できると思いますが、各注文アイテムから前のアイテムへのリンク (リンクされたリスト) に移行する可能性があります。それがこのクエリの作成を容易にする場合は、それに移動します。