MySQL查询指定日期无对应发票的商铺 LEFT JOIN查询反向结果获取
核心问题说明
你当前的查询本质已经是内连接逻辑:LEFT JOIN后在WHERE子句筛选右表sh__shop_invoice的非空字段,会自动排除所有没有匹配到发票的商铺,所以直接写NOT LIKE "2021-08-01"只能筛掉刚好有该日期发票的商铺,会漏掉完全没有开过任何发票的商铺,无法得到正确结果。
实现方案
方案1:LEFT JOIN + 关联条件前置
把日期筛选条件放到JOIN的ON子句中,仅关联指定日期的发票记录,再筛选没有匹配到发票的商铺即可:
SELECT sh__shop.id AS shop_id, sh__shop.name FROM sh__shop LEFT JOIN sh__shop_invoice ON sh__shop_invoice.shop_id = sh__shop.id AND sh__shop_invoice.month_commission = '2021-08-01' -- 日期条件提前到关联阶段 WHERE sh__shop_invoice.id IS NULL -- 筛选没有匹配到对应发票的商铺
注:如果
month_commission是日期类型,直接用=比LIKE效率更高,不需要模糊匹配。
方案2:NOT EXISTS 子查询
逻辑更直观,性能和方案1基本一致:
SELECT sh__shop.id AS shop_id, sh__shop.name FROM sh__shop WHERE NOT EXISTS ( SELECT 1 FROM sh__shop_invoice WHERE sh__shop_invoice.shop_id = sh__shop.id AND sh__shop_invoice.month_commission = '2021-08-01' )
两种方案都可以覆盖两类符合要求的商铺:
- 开过发票但从未开具过2021-08-01对应发票的商铺
- 从未开具过任何发票的商铺
内容的提问来源于stack exchange,提问作者London Smith
相关产品推荐
相关产品推荐

