获取相关记录没有任何其他关系的所有记录

时间:2015-04-13 15:10:47

标签: mysql sql join

我有一张products的表格,其中有许多variantsvariant有0到多个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

product

但如果我没有弄错的话,那么一个产品有两个变体的产品,其中一个有图像,一个没有,将包含在结果集中。

如何构建我的联接/哪里以便我只能检索variants所有images没有任何{{1}}的内容?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以通过

获取所有变体都没有图像的所有产品
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

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