SQL查询问题:关联products与categories表获取分类名称失败
别着急,咱们一步步排查问题所在,INNER JOIN返回空通常是因为关联条件没匹配上或者数据本身有问题,给你几个实用的排查方向:
先确认两张表的关联数据是否真的匹配
INNER JOIN只会返回两边都有匹配的记录,你可以先查一下products表的category_id都有哪些值:SELECT DISTINCT category_id FROM products;再对比
categories表的id:SELECT id FROM categories;看看有没有交集。另外,也可以直接找出
products里没有对应分类的记录:SELECT * FROM products WHERE category_id NOT IN (SELECT id FROM categories) OR category_id IS NULL;如果这个查询有结果,说明要么是
category_id的值在categories里不存在,要么是category_id为NULL,这两种情况INNER JOIN都不会返回数据。检查字段数据类型是否一致
有时候看起来数值一样,但字段类型不匹配也会导致关联失败——比如categories.id是INT类型,而products.category_id是VARCHAR类型,哪怕存的都是数字,数据库也会认为它们不相等。你可以用这两个命令查看字段类型:DESCRIBE categories; DESCRIBE products;对比
id和category_id的类型,如果不一致,要么修改字段类型统一,要么在JOIN的时候做类型转换(比如CAST(p.category_id AS UNSIGNED) = c.id)。确认两张表是否有数据
别忽略最基础的情况:如果products表是空的,或者categories表是空的,INNER JOIN肯定返回空。你可以分别统计两张表的行数:SELECT COUNT(*) FROM products; SELECT COUNT(*) FROM categories;用LEFT JOIN辅助排查
换成LEFT JOIN试试,看看能返回什么结果:SELECT c.name, p.id AS product_id FROM categories AS c LEFT JOIN products AS p ON c.id = p.category_id;如果结果里有
name但product_id是NULL,说明这个分类没有对应的产品;如果结果全是空,那大概率是其中一张表没数据;如果有product_id但name是NULL,说明产品的category_id在分类表里找不到对应项。
如果排查后发现是数据缺失(比如产品的category_id无效),要么补全categories表的对应分类,要么修正products表的category_id值;如果是需要包含无分类的产品,那应该用LEFT JOIN来替代INNER JOIN。
内容的提问来源于stack exchange,提问作者user6398538

