我有以下查询,其中连接了几个表。其中一个表是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
我只是不确定如何让它在这种情况下工作,但它不起作用。
答案 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 = ?
我不确定哪一个有更好的表现。你必须自己尝试一下。