SELECT多行,每行在另一个表中有多个相关的行

时间:2017-05-22 08:58:24

标签: php mysql sql

OrdersOrderitems返回所有数据以进行显示的推荐方式是什么(见下文)?我还希望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 |
+----+--------------+---------------+

1 个答案:

答案 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