即使子查询中不存在sql返回值,如何使其返回值?

时间:2016-06-21 09:03:57

标签: mysql sql select

所以我得到了一张名为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。

最后,如果可以以任何方式优化上述查询?

1 个答案:

答案 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