为什么这两个mysql查询不同?

为什么这两个mysql查询不同?,mysql,Mysql,以及: 返回不同的结果集,为什么?第一个查询在WHERE子句中有OR: select distinct p.product_id from cscart_products p left join product_bikes pb on p.product_id = pb.product_id and pb.bike_id = 111 left join cscart_product_options po on po.product_id = p.product_id l

以及:


返回不同的结果集,为什么?

第一个查询在WHERE子句中有OR:

select distinct p.product_id from cscart_products p 
    left join product_bikes pb on p.product_id = pb.product_id and pb.bike_id = 111
    left join cscart_product_options po on po.product_id = p.product_id
    left join cscart_product_option_variants pov on pov.option_id = po.option_id
    left join variant_bikes vb on vb.variant_id = pov.variant_id and vb.bike_id = 111
第二个查询实际上具有以下条件:

WHERE pb.bike_id = 111 OR vb.bike_id = 111

附加问题:有没有一种方法可以使连接行为相同,并从较小的连接中获得性能优势

有一种方法可以编写查询,但不一定更快,因为该方法(我正在考虑)使用UNION:

LEFT JOIN product_bikes pb ON p.product_id = pb.product_id AND pb.bike_id = 111
...
LEFT JOIN variant_bikes vb ON vb.variant_id = pov.variant_id AND vb.bike_id = 111
可能有一种更好的方法,例如使用UNION子查询,大致如下:

select distinct p.product_id from cscart_products p 
    left join product_bikes pb on p.product_id = pb.product_id and pb.bike_id = 111
    left join cscart_product_options po on po.product_id = p.product_id
    left join cscart_product_option_variants pov on pov.option_id = po.option_id
    left join variant_bikes vb on vb.variant_id = pov.variant_id -- and vb.bike_id = 111
UNION
select distinct p.product_id from cscart_products p 
    left join product_bikes pb on p.product_id = pb.product_id -- and pb.bike_id = 111
    left join cscart_product_options po on po.product_id = p.product_id
    left join cscart_product_option_variants pov on pov.option_id = po.option_id
    left join variant_bikes vb on vb.variant_id = pov.variant_id and vb.bike_id = 111

由于您没有(在本例中)从
cscart\u产品选项
cscart\u产品选项
表中选择数据,因此可以从查询中删除这些数据。您还应该查看与子查询的左连接是否合适;我认为你更可能想要一个内部连接。除了Jonathan所说的之外,可能还需要做更多的工作来提高性能。

。在第一个查询中,WHERE强制它除非(pb.bike_id=111或vb.bike_id=111)为true,否则不会得到任何结果。在第二个查询中,您将获得所有不同的[product_id],即使只有一行能够通过左连接进行连接

如果你从第二个查询和第一个查询中得到了很多结果,那就是这样。更容易看出这一点的方法是在您的选择中添加更多内容,以便:

SELECT DISTINCT p.product_id
  FROM      cscart_products                AS p 
  LEFT JOIN cscart_product_options         AS po  ON po.product_id = p.product_id
  LEFT JOIN cscart_product_option_variants AS pov ON pov.option_id = po.option_id
  LEFT JOIN (SELECT vb.product_id FROM variant_bikes AS vb WHERE vb.bike_id = 111
             UNION
             SELECT pb.product_id FROM product_bikes AS pb WHERE pb.bike_id = 111
            ) AS pv ON pv.product_id = p.product_id
您会注意到,如果这样做,第一个查询将在它显示的每个产品中有111个,但是第二个查询将有很多pb.bike_id的空值


有意义吗?

好的,太好了:)谢谢你,我再等11分钟就不会给你答案了。附加问题:有没有一种连接方式可以使其行为相同并从较小的连接中获益?将pb.bike_id不为NULL或vb.bike_id不为NULL的
添加到第二个查询的末尾。其他连接类型是否也可以工作,例如对这些连接使用完全连接Barmar?谢谢Jonathan,如果我不加入其他表,虽然我无法知道哪些变体属于该产品,但我会继续尝试,谢谢:)我也尝试了内部加入,但这些表根本不会返回任何数据集:(
SELECT DISTINCT p.product_id
  FROM      cscart_products                AS p 
  LEFT JOIN cscart_product_options         AS po  ON po.product_id = p.product_id
  LEFT JOIN cscart_product_option_variants AS pov ON pov.option_id = po.option_id
  LEFT JOIN (SELECT vb.product_id FROM variant_bikes AS vb WHERE vb.bike_id = 111
             UNION
             SELECT pb.product_id FROM product_bikes AS pb WHERE pb.bike_id = 111
            ) AS pv ON pv.product_id = p.product_id
SELECT p.product_id, pb.bike_id ...