mysql - 在 SQL 查询中使用 else

标签 mysql sql

我有以下查询,其中连接了几个表。其中一个表是 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/

相关文章:

mysql - 合并两个 MySQL 计数查询

php - 通过 php 将日期插入到 php 表失败

sql - 在全局表中插入上传的文件值

MySQL 大海捞针搜索键

mysql - 如何从 MySQL 数据库中选择今天日期之后的事件

php - SQL 请求取决于下拉菜单

sql - 使用 2 个键加速连接

sql - 如何在 XSLT 中执行类似 "while"的循环?

sql - 在 Oracle 数据库中搜索具有特定列名的表?

mysql - 从 phpmyadmin 运行 mysql 查询仅更改了 1 条记录。尝试过 ssh 但同样的问题