所以我得到了一张名为pet_size的表,代表...宠物大小! 尺寸可以是:
id name
1 small
2 medium
3 large
此外,0表示未知或未提供,但未添加到表中。
然后我得到了这个问题:
SELECT pet_breed.id, pet_breed.breed_name, pet_type.type_name, pet_size.size_name
FROM pet_breed,
pet_type,
pet_size
WHERE pet_breed.petTypeId = pet_type.id
AND pet_breed.sizeId = pet_size.id
ORDER BY pet_breed.id
上述功能完全适用于任何记录,除了在pet_breed.sizeId中得到0的那些记录,因为它在pet_size.id中不存在,除了向pet_size表添加虚拟值之外,修复它的最优雅的方法是什么?
我希望如果sizeId为0,只需使用“unknown”作为size_name。
最后,如果可以以任何方式优化上述查询?
答案 0 :(得分:3)
您正在使用旧式联接,更新以使用正确的LEFT JOIN
,您将获得您期望的结果
SELECT
pb.id
,pb.breed_name
,pt.type_name
,IFNULL(ps.size_name,'Unknown') size_name
FROM pet_breed pb
LEFT JOIN pet_type pt
ON pb.petTypeId = pt.id
LEFT JOIN pet_size ps
ON pb.sizeId = ps.id
ORDER BY pb.id
我已经使用表别名更新了它,这将使您的代码更具可读性。
您的旧联接充当INNER JOINS
,只返回所有表中具有匹配值的行。
编辑:重新阅读问题并添加ISNULL
以捕获数据不匹配的位置。
Edit2:IFNULL for mysql,而不是ISNULL