在SQL查询中使用else

时间:2016-11-25 19:57:11

标签: mysql sql

我有以下查询,其中连接了几个表。其中一个表是profile_img。此表包含已上传它们的用户的个人资料图片,否则他们会被profile_images/default.jpg,而用户不在profile_img表中,因此我需要一个类别的案例来检查他们是否不是{&1}。在该表中,然后将其配置文件图像设置为默认值。

这是我的查询。

    SELECT f.*, u.*, p.*
    FROM friends f
    LEFT JOIN
        profile_img p
        ON p.user_id = f.friend_one
    JOIN
        users u
        ON u.id = f.friend_one
    WHERE f.friend_two = ? AND f.status = ? AND
        p.id = (select max(p2.id) from profile_img p2 where p2.user_id = p.user_id)

我已尝试,coalesce(p.img, 'profile_images/default.jpg') as img尝试获取结果,但它没有帮助。

在另一个查询中:

(case when p.img <> '' then p.img
 else 'profile_images/default.jpg'
end) as img

我只是不确定如何让它在这种情况下工作,但它不起作用。

2 个答案:

答案 0 :(得分:1)

您可以选择有条件设置其值的字段,例如使用IFNULL()

SELECT f.*, u.*, p.*, IFNULL(p.image_url, 'default.png') AS profile_pic
FROM friends f
LEFT JOIN
    profile_img p
    ON p.user_id = f.friend_one
JOIN
    users u
    ON u.id = f.friend_one
WHERE f.friend_two = ? AND f.status = ? AND
    p.id = (select max(p2.id) from profile_img p2 where p2.user_id = p.user_id)

答案 1 :(得分:1)

@marekful在使用ifnull()时是正确的,但还有一个需要的其他修复。

在你的where子句中引用p.id =。由于当该用户没有profile_img行时p将为null,因此由于比较为null,整个行将从结果中排除。

此查询考虑了null p.id字段,并且无论如何通过在其null时允许p.id来包含它们。现在p.image_url将为null,ifnull()方法将为这些行响应'default.png'。

SELECT f.*, u.*, p.*, IFNULL(p.image_url, 'default.png') AS profile_pic
FROM friends f
LEFT JOIN
    profile_img p
    ON p.user_id = f.friend_one
JOIN
    users u
    ON u.id = f.friend_one
WHERE 
    f.friend_two = ? 
    AND f.status = ? 
    AND ( p.id is null or p.id = (select max(p2.id) from profile_img p2 where p2.user_id = p.user_id) )

通过将子查询添加到ON谓词,您也可以在没有OR子句的情况下执行此操作。然后在连接之前解析子查询。

SELECT f.*, u.*, p.*, IFNULL(p.image_url, 'default.png') AS profile_pic
FROM friends f
JOIN
    users u
    ON u.id = f.friend_one
LEFT JOIN
    profile_img p
    ON p.user_id = f.friend_one and p.id = (select max(p2.id) from profile_img p2 where p2.user_id = p.user_id)     
WHERE 
    f.friend_two = ? 
    AND f.status = ? 

我不确定哪一个有更好的表现。你必须自己尝试一下。