【问题标题】:Select distinct union with composite keys使用复合键选择不同的联合
【发布时间】:2015-04-14 00:13:48
【问题描述】:

所以, 我当前的问题是从 php/pdo/mysql 创建一个语言文件。有多个结构相同的语言表,但应用程序每次运行仅使用 2 个 - 一种可能不完整的用户选择语言和一种完整的后备语言。现在我们假设英语表是完整的,但任何翻译表都可能不完整,所以我们希望从英语表中返回任何丢失的翻译。

所以,假设表格是 lang_EN 和 lang_DE,列有 section、type、label、content

lang_EN:

section:'admin', type:'button', label:'hello', content:'Hello World'

section:'admin', type:'button', label:'goodbye', content:'Goodbye Cruel World'

lang_DE:

section:'admin', type:'button', label:'hello', content:'Hallo Welt'

表的主键是(部分、类型、标签)的组合。不能有其他索引 - 这是由于语言表的填充方式和使用重复键更新查询插入更新的方式。

由于服务器约束限制,它必须在单个查询中完成。我一直在想唯一可以做到的方法是通过沿线的联合

从语言_EN中选择内容 WHERE 部分 = '管理员' AND type = '按钮'

联合不同

从语言_DE 中选择内容 WHERE 部分 = '管理员' AND type = '按钮'

预期结果是: 你好世界 再见残酷的世界

我知道可以通过在所有表中添加匹配的索引键轻松创建查询,但是由于语言变化的潜在差异和不可能的更新方式,所以我现在很难过。

任何指针将不胜感激。

【问题讨论】:

    标签: php mysql pdo union composite-primary-key


    【解决方案1】:

    我找到了使用行子查询构造函数的解决方案:

    SELECT content FROM language_EN WHERE section = 'admin' AND type = 'button'

    WHERE (section,type,label) NOT IN (SELECT section,type,label FROM language_DE)

    联合

    SELECT content FROM language_DE WHERE section = 'admin' AND type = 'button'

    【讨论】:

      【解决方案2】:

      我会建议这种方法:

      (SELECT content
       FROM language_DE
       WHERE section = 'admin' AND type = 'button'
      ) UNION ALL
      (SELECT content
       FROM language_EN en
       WHERE section = 'admin' and type = 'button' and
             NOT EXISTS (SELECT 1
                         FROM language_DE de
                         WHERE de.section = en.section and de.type = en.type and de.label = en.label
                        )
      )
      

      与您的方法相比有两个优势。首先,您可以选择额外的列,而不必担心union distinct 会丢失重复项。其次,这使用索引并且没有昂贵的重复删除操作。

      【讨论】:

      • 谢谢戈登。我应该睡在这个上,但不能。我已经采用了这种方法,它只返回 language_DE 表中的结果。
      • @MrBob 。 . .也就是说,第二个子查询没有返回任何内容。这是真的吗?
      • 是的。我可以看到它的前进方向,你启发我使用行子查询得到下面的答案。
      • @MrBob 。 . .我错过了“标签”是您正在寻找的关键的一部分。
      猜你喜欢
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 2023-03-28
      • 2021-12-08
      • 2013-08-25
      • 2020-03-05
      相关资源
      最近更新 更多