【问题标题】:Get all records where related records does not have any other relationships获取相关记录没有任何其他关系的所有记录
【发布时间】:2015-06-18 23:16:40
【问题描述】:

我有一张products 的桌子,里面有很多variantsvariant 有零到多个 images

+---------+
| Product |
+---------+
    1|    
     |    
     |1..n   
+---------+
| Variant |
+---------+
    1|    
     |    
     |0..n   
+---------+
|  Image  |
+---------+

我需要更新所有products,其中没有一个variants 有任何images。我可以使用以下查询找到所有products,其中一些variants 没有images

SELECT
   DISTINCT `p`.*
FROM `sylius_product` AS `p`
    JOIN `sylius_product_variant` AS `v` ON `v`.`product_id` = `p`.`id`
    LEFT JOIN `sylius_product_variant_image` AS `i` ON `i`.`variant_id` = `v`.`id`
WHERE `i`.`id` IS NULL

但如果我没记错的话,结果集中包含两个变体的产品,一个有图像,一个没有。

我如何构造我的连接 / where 以便我只能检索 product 而所有 variants 都没有任何 images

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    您可以通过加入和聚合来做到这一点:

    select p.*
    from sylius_product p join
         sylius_product_variant v
         on v.product_id = p.id left join
         sylius_product_variant_image i
         on i.variant_id = v.id
    group by p.id
    having max(i.variant_id) is null;
    

    如果所有变体都没有图像,则产品上根本没有图像。 having 条件也可以写成:

    having count(i.variant_id) = 0
    

    【讨论】:

      【解决方案2】:

      您可以通过这样做获得所有变体都没有图像的所有产品

      SELECT  `p`.`id`
      FROM `sylius_product` p
      LEFT JOIN (
      SELECT  DISTINCT `v`.`product_id`
      FROM  `sylius_product_variant` AS `v` 
      JOIN `sylius_product_variant_image` AS `i` ON `i`.`variant_id` = `v`.`id`
      ) p1
      ON `p`.`id` = `p1`.`product_id`
      WHERE `p1`.`product_id` IS NULL
      

      连接部分的子查询将获取其变体有图像的产品,然后在主查询中我们可以使用左连接消除这些产品

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        相关资源
        最近更新 更多