MySQL联表查询:用CASE WHEN获取消费者有效地址且无地址置空的实现
查询语句调整方案
原语句的问题点
- 直接写
JOIN默认是内连接,只会保留两张表能匹配上的记录,像id=3没有任何地址的Rico会被直接过滤,根本不会出现在结果里,满足不了“无地址返回NULL”的要求 - 关联地址表的时候没加状态过滤,会把消费者的所有地址(包括status=0的无效地址)都带出来,就算在SELECT里写CASE判断,也会每个消费者查出两行结果,和预期的单条有效地址对不上
- 列别名自定义成大驼峰格式,和预期结果要求的列名不匹配
可直接用的修正SQL
SELECT c.id_consumer, c.name, ca.address, ca.status FROM consumer c -- 换成左连接,全量保留消费者表的记录,没匹配到地址的字段自动为NULL LEFT JOIN consumer_address ca ON ca.id_consumer = c.id_consumer -- 关联条件里直接只匹配status=1的有效地址,直接把无效地址全部排除 AND ca.status = 1
匹配效果说明
- 有有效地址的Roy、Dori,都会只关联到自己那条status=1的地址,直接取字段值就行,不用写复杂的CASE逻辑
- 没有任何地址记录的Rico,左连接匹配不到地址表的行,address和status字段自然返回NULL,跑出来的结果和要求的预期表完全一致
补充:如果后续业务出现同一个消费者有多条status=1的地址,只要在最后加
GROUP BY c.id_consumer就能保证每个消费者只出一行,当前测试数据里不存在这个情况,不需要额外加。
内容的提问来源于stack exchange,提问作者rico ardi saputra
相关产品推荐
相关产品推荐

