如何在 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 表关系中选择特定值或任何其他值的主要内容,如果未能解决你的问题,请参考以下文章

在所有表中搜索具有给定值或名称的字段[重复]

在所有表中搜索具有给定值或名称的字段[重复]

MYSQL - 从列中选择一个值或(如果没有给出值)全选[关闭]

如何检查数组中的声明值或 Ocelot 网关中的任何值?

如何在 Vue 中传递一个选择的选定值或索引?

即使数据库中不存在我如何返回特定时间的数据