我有两个在父子关系中相关的表
Sale
sale_id | customer_name
SaleItem
item_id | sale_id | item_type
每条销售记录都有一个或多个对应的销售项目记录。我的目标是创建一个销售列表,并将其对应的 SaleItems 显示为子项。我可以用这个查询来做到这一点:
SELECT s.sale_id, s.customer_name, si.item_id, si.item_type
FROM Sale s, SaleItem si
WHERE s.sale_id=si.sale_id
ORDER BY s.sale_id, si.item_id
这会产生类似这样的结果(为了清楚问题,添加了空白行):
sale_id | customer_name | item_id | item_type
1 | Sam | 1 | D
1 | Sam | 2 | B
1 | Sam | 3 | D
2 | Nate | 4 | A
2 | Nate | 5 | B
3 | Mike | 6 | B
3 | Mike | 7 | C
4 | Nate | 8 | C
4 | Nate | 9 | D
ORDER BY 子句会导致 Sales 与其已排序的 SaleItem 进行逻辑分组。这为我提供了编写一个漂亮的可折叠 UI 来表示数据所需的数据:
-Sale 1 - Sam
-B
-B
-D
+Sale 2 - Nate
+Sale 3 - Mike
-Sale 4 - Nate
-C
-D
这一切都很好,但是当我想按 item_type 对该列表进行排序时会发生什么?我想得到这样的结果集(为了清楚问题,添加了空白行):
sale_id | customer_name | item_id | item_type
2 | Nate | 4 | A
2 | Nate | 5 | B
3 | Mike | 6 | B
3 | Mike | 7 | C
4 | Nate | 8 | C
4 | Nate | 9 | D
1 | Sam | 1 | D
1 | Sam | 2 | B
1 | Sam | 3 | D
请注意,每个销售及其对应的销售项目保持在一起。基本上我在这里需要做的是将每组 Sale+SaleItems 视为一个元素,并按任何列智能地对它们进行排序。因为我们本质上只是在这里对销售进行排序,并且 item_type 适用于 SaleItem,所以我们只需按第一个 SaleItem 的 item_type 进行排序,并保持销售中 SaleItems 的原始排序顺序。我真的希望这是有道理的。
我有一些问题:
- 我会以错误的方式解决这个问题吗?由于每个销售记录是一个或多个销售项目记录的“父”,因此 JOIN 似乎有点矫枉过正,因为我最终在每个“子”行中都重复了“父”数据。
- 如何按每个销售的第一个 item_type 对这些数据进行排序,并且仍然将每个销售的 SaleItems 保持在一起?
万分感谢。