微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带外键的 SQL 查询缺失数据,返回默认值

如何解决带外键的 SQL 查询缺失数据,返回默认值

我有一张桌子叫

"machine" (columns: machine_id(pk),year,site,color) 

一个名为

的表
"machine_description" (columns: machine_id(fk),language,description)

我想创建一个 sql 查询,我可以在其中输入首选语言,并返回所有具有首选语言的适当描述的机器。 (我已经成功了)

SELECT *
FROM machine 
LEFT JOIN machine_description ON machine.machine_id = machine_description.machine_id 
WHERE machine_description.description = "german";

但是,我的问题是,对于某些机器,无法使用所需语言进行描述。在这种情况下,认情况下应以英语而不是所需语言返回描述。 我怎么解决这个问题? 看图

非常感谢您的回答。 附注。我在这个领域很新...

enter image description here

解决方法

从 MySQL 8 开始,您可以使用窗口函数进行排名(先选择德语和英语,然后将前者排名高于后者,并保留排名较好的行):

select *
from
(
  select
    m.*,md.*,row_number() over (partition by m.machine_id order by language desc) as rn
  from machine m
  join machine_description md on md.machine_id = m. machine_id
                              and md.language in ('german','english')
) both
where rn = 1;

如果您想允许所需语言和英语都不可用并且您想仍然显示机器的情况,请将其设为左外连接。

但您也可以在 select 子句中使用子查询:

select m.*
  (
    select md.description
    from machine_description md
    where md.machine_id = m. machine_id
    and md.language in ('german','english')
    order by md.language desc -- German before English
    limit 1
  ) as descr
from machine m;

我按语言降序排序,以便在英语之前获得德语。对于使用 CASE WHEN 进行排序的更通用的解决方案:

order by case when md.language = 'english' then 1 else 0 end

或者只是

order by (md.language = 'english')

因为在 MySQL 中 true 为 1,false 为 0。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。