SQL连接或合并结果?

时间:2013-01-14 23:51:42

标签: mysql sql relational-database

查看此数据库架构:

DB Schema

用户可以订购产品。对于任何订单,我在订单表中添加新记录,在 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个查询构建的数组是最好的方法吗? 我可以通过一次查询来完成吗?
您如何看待性能?

4 个答案:

答案 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。这将为您提供您正在寻找的结果。