查看此数据库架构:
用户可以订购产品。对于任何订单,我在订单表中添加新记录,在 orders-products N:M表中为用户订购的任何单个产品添加新记录(并填写件)领域)。但是,当用户创建订单时,我需要显示所有产品的列表,并使用为任何产品订购的数量填充件数字段。
通常,为此,我使用两个查询 第一个查询获取产品表中的所有产品:
SELECT * FROM products;
第二个查询通过 orders-idorder FK获取 orders-products 表过滤中订购的产品:
SELECT orders_idorder AS idorder, products_idproduct AS idproduct, pieces FROM orders_products WHERE orders_idorder=1;
然后我将结果合并到一个数组中,然后使用它来显示产品的完整列表,其中包含为每个产品订购的产品。最终的结果是这样的:
+---------+-----------+--------------+-------+--------+ | idorder | idproduct | description | price | pieces | +---------+-----------+--------------+-------+--------+ | 1 | 1 | Product 1 | 10.20 | 2 | | 1 | 2 | Product 22 | 11.00 | NULL | | 1 | 3 | Product 333 | 19.22 | NULL | | 1 | 4 | Product 4444 | 9.20 | NULL | +---------+-----------+--------------+-------+--------+
注意 :在上面的示例中,产品表中有4条记录,而 orders-products中只有1条记录表(它有idorder = 1,idproduct = 1和pieces = 2)
- >在这里,您可以找到SQL Dump来测试查询
合并从2个查询构建的数组是最好的方法吗?
我可以通过一次查询来完成吗?
您如何看待性能?
答案 0 :(得分:1)
通常让数据库优化合并将比您在代码中可以做的更好。数据库通常也更好地进行排序。
如何构建查询取决于您所需的结果集。如果您想要所有产品,无论它们是否出现在订单表中,那么您将使用OUTER JOIN,否则INNER JOIN将过滤掉从未订购过的产品。
如果您为某些示例数据提供了所需的结果,我们可能会帮助您查询,但请先自行尝试。
set @searchOrderId = 1;
select ifnull(op.orders_idorder, @searchOrderId) AS idOrder,
p.idproduct,
p.description,
p.price,
op.pieces
from products p
left join orders_products op on op.products_idproduct = p.idproduct
where ifnull(op.orders_idorder, @searchOrderId) = @searchOrderId ;
SQL Fiddle我正在玩它来测试它。
答案 1 :(得分:0)
当然,您可以通过将表连接在一起来使用单个查询来获取信息。这是你遇到麻烦的吗?
答案 2 :(得分:0)
我认为通常,执行单个查询来检索结果将比执行两个查询并合并结果更好。鉴于所提供的信息,不可能说出理想的执行计划是什么。表格大小,架构等将发挥作用。
要从单个订单中检索所有产品,请尝试:
select
o.idorder,
p.idproduct,
p.description,
p.price,
op.pieces
from
orders o
inner join orders_products op
on o.idorder = op.orders_idorder
inner join products p
on op.products_idproduct = p.idproduct
where
o.idorder = 1
答案 3 :(得分:0)
我明白了,你想要从Products表到LEders JOIN的LEFT JOIN。这将为您提供您正在寻找的结果。