Mysql SQL连接或合并结果?

Mysql SQL连接或合并结果?,mysql,sql,relational-database,Mysql,Sql,Relational Database,看看这个数据库模式: 用户可以订购产品。对于任何订单,我在orders表中添加一条新记录,并在orders products N:M表中为用户订购的任何单个产品添加一条新记录(和fill pieces字段)。但是,当用户创建订单时,我需要显示所有产品的列表,并用任何产品的订购数量填充“件”字段 通常情况下,我会使用两个查询。 第一个查询获取products表中的所有产品: 第二个查询获取orders products表中订购的产品按orders idorder FK过滤它们: 然后,我将结果合

看看这个数据库模式:

用户可以订购产品。对于任何订单,我在orders表中添加一条新记录,并在orders products N:M表中为用户订购的任何单个产品添加一条新记录(和fill pieces字段)。但是,当用户创建订单时,我需要显示所有产品的列表,并用任何产品的订购数量填充“件”字段

通常情况下,我会使用两个查询。
第一个查询获取products表中的所有产品:

第二个查询获取orders products表中订购的产品按orders idorder FK过滤它们:

然后,我将结果合并到一个数组中,并使用它显示完整的产品列表,以及为每个产品订购的产品。最终结果如下:

+---------+-----------+--------------+-------+--------+ | 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 | +---------+-----------+--------------+-------+--------+ +---------+-----------+--------------+-------+--------+ |idorder | idproduct |说明|价格|件| +---------+-----------+--------------+-------+--------+ |1 | 1 |产品1 | 10.20 | 2| |1 | 2 |产品22 | 11.00 |空| |1 | 3 |产品333 | 19.22 |空| |1 | 4 |产品4444 | 9.20 |空| +---------+-----------+--------------+-------+--------+ 注意:在上述示例中,products表中有4条记录,orders products表中只有1条记录(idorder=1,idproduct=1,pieces=2)。
->在这里,您可以找到测试查询的方法。


合并由两个查询生成的数组是最好的方法?
我可以用一个查询完成吗?

您认为性能如何?

请确保通过将表连接在一起,您可以使用单个查询获得信息。这是您遇到的问题吗?

通常,让数据库优化合并比您在代码中可以做的更好。db通常也更擅长排序

如何构造查询取决于所需的结果集。如果您想要所有产品,而不管它们是否出现在orders表中,那么您应该使用外部联接,否则内部联接将过滤掉从未订购过的产品

如果您为我们提供一些示例数据所需的结果,我们可能可以帮助您进行查询,但请您自己先试一试

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 ;

我一直在玩这个游戏来测试它。

我认为一般来说,执行一个查询来检索结果要比执行两个查询并合并结果更好。鉴于提供的信息,不可能说出理想的执行计划是什么。表的大小、结构等将发挥作用

要从单个订单检索所有产品,请尝试:

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

我明白了,您想要从Products表到Orders\u Products的左联接。这会给你你想要的结果。

我对你想要的有点困惑。您是否希望在给定单个订单id的情况下,通过单个查询显示所有订购数量的产品?
包含哪些信息?是否只是与给定订单对应的
产品
表中的条目数?@willOEM是。然后我想知道什么是最好的方法。jwd是的,它是订购产品的整数。请在这里填写查询。谢谢。看来WillOEM已经为你写了这个查询。我也会用同样的方式写。阅读我上面的评论,它不正确。现在我添加了SQL转储来测试您的查询。请在这里编写查询。谢谢。谢谢。我尝试了你的查询,但它只返回1条记录(idproduct=1),这是表products中唯一一条匹配的记录。我理解您关于性能的意思,我同意。现在我添加了SQL转储来测试您的查询。此查询将只返回订单中包含products表中存在的产品的记录。您应该避免将产品标识放入orders\u products表中,因为产品中不存在这些标识。orders\u products中的ID应该是引用父表的外键,并且应该强制执行此引用。orders\u products表中没有“product\u ID,products中不存在”。在orders products表中,我为任何订购的产品放置了一条记录。这是管理订购产品的正确方法。您是否有其他模式/解决方案来管理它们?请让我的垃圾桶明白我的意思。对不起,我还是有点困惑。因此,您正在寻找的输出与上面示例中的输出类似?在给定订单ID的情况下,是否需要所有产品(是否包含在订单中)的列表以及订单中这些产品的数量?
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 ;
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