问题描述
我有一张桌子叫
"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";
但是,我的问题是,对于某些机器,无法使用所需语言进行描述。在这种情况下,默认情况下应以英语而不是所需语言返回描述。 我怎么解决这个问题? 看图
非常感谢您的回答。 附注。我在这个领域很新...
解决方法
从 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。