如何在 1-N 表关系中选择特定值或任何其他值
Posted
技术标签:
【中文标题】如何在 1-N 表关系中选择特定值或任何其他值【英文标题】:How to SELECT an specific value or any other in a 1-N tables relation 【发布时间】:2021-07-26 02:23:23 【问题描述】:我想找到一个查询来执行以下结果,我尝试了很多不同的方法,但我真的找不到正确的方法,如果有人可以帮助我,我将不胜感激。
请记住,我可以有很多不同的语言,我总是想优先考虑一种。
有以下表格:
项目
id | info |
---|---|
1 | Etc |
2 | Etc |
item_translation
item_id | lang_id | value |
---|---|---|
1 | 1 | English Translation for item 1 |
1 | 2 | French translation for item 1 |
2 | 2 | French translation for item 2 |
我想选择所有项目,并且每个项目只选择一个 item_translation,优先考虑一种语言。 例如,如果我想选择所有优先考虑语言 1 的项目,它应该返回以下内容:
id | info | value | lang_id |
---|---|---|---|
1 | Etc | English Translation for item 1 | 1 |
2 | Etc | French translation for item 2 | 2 |
如果我想优先考虑语言 2:
id | info | value | lang_id |
---|---|---|---|
1 | Etc | French translation for item 1 | 2 |
2 | Etc | French translation for item 2 | 2 |
【问题讨论】:
【参考方案1】:要优先考虑lang_id
#1,您可以这样做:
select
i.id,
i.info,
x.value,
x.lang_id
from item i
left join (
select *,
row_number() over(partition by item_id
order by case when lang_id =
1 -- lang_id to prioritize
then 1 else 2 end) as rn
from item_translation
) x on x.item_id = i.id and x.rn = 1
结果:
id info value lang_id
--- ----- ------------------------------- -------
1 Etc English Translation for item 1 1
2 Etc French Translation for item 2 2
请参阅DB Fiddle 的运行示例。
它会显示:
当有多种语言可用时,它会优先使用首选语言。 当首选语言不可用时,它将选择随机其他。 当没有可用的翻译时,它将显示空值。【讨论】:
刚刚尝试了您的查询,它为没有优先语言的列的值返回 null。 复制粘贴查询的结果:Image 您的查询中的问题是子选择正在对所有表进行选择并且它没有使用 item_id 进行过滤,item_id 值在连接参数中给出,因此在子选择中被忽略,由于 i.id 在外部查询中,它不能传递给子查询,我希望我自己解释一下。 @FrancescArolas 我认为查询返回了正确的结果(我可能错了)。如果是这种情况,您关心的问题是由于延迟过滤导致的查询“性能”。理想的解决方案是使用横向查询,这是 MariaDB 和 mysql 尚不具备的功能(与 PostgreSQL、DB2、Oracle、SQL Server 不同)。 查询返回错误的结果,因为它有值时返回null。以上是关于如何在 1-N 表关系中选择特定值或任何其他值的主要内容,如果未能解决你的问题,请参考以下文章