我有以下查询,其中连接了几个表。其中一个表是 profile_img
。该表包含已上传用户的个人资料图像,否则会给出 profile_images/default.jpg
并且用户不在 profile_img
表中,所以我需要一个案例检查他们是否不在该表中,然后将他们的个人资料图像设置为默认图像。
这是我的查询。
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
我只是不确定如何让它在这种情况下工作,并且它对此不起作用。
最佳答案
@marekful 使用 ifnull() 是正确的,但还需要另一个修复。
在您的 where 子句中,您引用了 p.id =。由于当该用户没有 profile_img 行时 p 将为 null,因此由于与 null 进行比较,整行将被从结果中排除。
此查询考虑了空 p.id 字段,并通过允许 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 = ?
我不确定哪个性能更好。你必须亲自尝试一下。
关于mysql - 在 SQL 查询中使用 else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40811594/