【问题标题】:How to SELECT an specific value or any other in a 1-N tables relation如何在 1-N 表关系中选择特定值或任何其他值
【发布时间】: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

【问题讨论】:

    标签: mysql select mariadb


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多