【问题标题】:left join where is null and maybe having count() = 0?left join 哪里是 null 并且可能 count() = 0?
【发布时间】:2017-11-04 02:49:18
【问题描述】:

我有一张表 [seller]、[advert] 和 [sale]。

由于我的公司运作方式的怪癖,可以将销售的卖家更改为另一个卖家(让我们称之为孤儿销售),但 [sale] 表已更新以反映来自新卖家。

我想计算只有孤儿销售的用户的孤儿销售价格。

在获得价格之前,我什至无法创建只有孤儿销售的用户列表。

我正在尝试使用 where 为 null 进行左连接,这样我就可以获得那些没有销售的广告,然后使用 count() = 0 来获得那些没有销售的用户。

SELECT seller.id
FROM seller
JOIN advert ON advert.seller_id = seller.id
JOIN sale orphan ON advert.id = orphan.advert_id
JOIN sale accomplished_sale ON advert.id = accomplished_sale.advert_id
WHERE orphan.id IS NULL
GROUP BY seller.id
HAVING count(accomplished_sale.id) = 0

但是,我得到的是每个卖家至少有 1 次销售但没有销售,但有其他广告有销售。

鉴于 advert-sale 的关系是 n->1 我猜一个普通的连接只是一个左连接,对吧?卖家广告也会发生同样的事情。

我做错了什么?有任何想法吗?

【问题讨论】:

    标签: mysql left-join having


    【解决方案1】:

    如果您需要在一个(或多个)表上进行左连接,则必须调用它,例如:for left join on sale as orphan

    SELECT seller.id
    FROM seller
    INNER JOIN advert ON advert.seller_id = seller.id
    LEFT JOIN sale orphan ON advert.id = orphan.advert_id
    INNER JOIN sale accomplished_sale ON advert.id = accomplished_sale.advert_id
    WHERE orphan.id IS NULL
    GROUP BY seller.id
    HAVING ifnull(count(accomplished_sale.id), 0)  = 0
    

    【讨论】:

      【解决方案2】:

      看到你的查询后,我认为下面的查询会给你接受的输出。

      SELECT distinct seller.id
      
      FROM seller
      
      JOIN advert ON advert.seller_id = seller.id
      
      JOIN sale orphan ON advert.id = orphan.advert_id
      
      JOIN sale accomplished_sale ON advert.id = accomplished_sale.advert_id
      
      WHERE orphan.id IS NULL
      
      HAVING count(accomplished_sale.id) = 0
      

      【讨论】:

        【解决方案3】:

        尝试以下不使用连接语法的方法:

        SELECT seller.id
        FROM seller, sale, advert
        WHERE advert.seller_id = seller.id
        AND advert.id = sale.advert_id
        AND sale.id IS NULL
        GROUP BY seller.id
        HAVING count(accomplished_sale.id) = 0
        

        【讨论】:

        • @MichaelMcGriff 是的,这是笛卡尔连接。改了。
        猜你喜欢
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-16
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 1970-01-01
        相关资源
        最近更新 更多