从Orders
和Orderitems
返回所有数据以进行显示的推荐方式是什么(见下文)?我还希望qty
信息可用,因为当我将鼠标悬停在任何产品ID上时,我打算将其用作工具提示。感谢。
1)如果我使用INNER JOIN的1个查询,我将复制每行的订单数据。它将返回数据的大小加倍1..N倍。在将JSON返回到我的前端之前,我会丢弃复制的数据。但这是一种不好的做法吗?
2)如果我使用分页LIMIT 10
的2个查询,我将不知道在第二个查询中使用了哪个ids
如果ID不是完全增加(因为有些被删除了。)
订单
+----+--------+ | id | custid | +----+--------+ | 1 | 43 | | 2 | 843 | | 3 | 12 | +----+--------+
的OrderItems
+----+--------------+---------------+-----+ | id | fk_orders_id | fk_product_id | qty | +----+--------------+---------------+-----+ | 1 | 1 | 2454 | 1 | | 2 | 1 | 153 | 2 | | 3 | 1 | 2 | 1 | | 4 | 2 | 25390 | 1 | | 5 | 2 | 2214 | 2 | | 6 | 3 | 11353 | 3 | +----+--------------+---------------+-----+
显示
+----+--------------+---------------+ | id | custid | fk_product_id | +----+--------------+---------------+ | 1 | 43 | 2454,153,2 | | 2 | 843 | 25390,2214 | | 3 | 12 | 11353 | +----+--------------+---------------+
答案 0 :(得分:0)
第二种选择是正确的。这包含几个步骤:
1)以这样的方式获取所有Order
分页:
SELECT * FROM orders
WHERE id > 0
ORDER BY id ASC
LIMIT 10
2)在一些空数组中收集所有提取的订单ID。
3)以您想要的任何顺序获取所有相应的OrderItems
:
SELECT * FROM order_items
WHERE order_id IN (1,2,3,4) // array of orders ids
ORDER BY id ASC // could use any order you want to
4)通过提取的OrderItems
进行迭代,并将其正确对应Order
。
3a)如果您希望每个OrderItems
仅获取少量Order
,则可以使用像这样的窗口函数ROW_NUMBER
:
SELECT t.* FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY id ASC) num FROM order_items
WHERE order_id IN (1,2,3,4)
) t
WHERE t.num <= 5 // if you wish only first 5 order items per each order
ORDER BY t.num ASC