使用复合键选择不同的联合

时间:2015-04-14 00:13:49

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

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

所以,让我们说这些表是lang_EN和lang_DE,包含列部分,类型,标签,内容

lang_EN:

部分:' admin',键入:'按钮',标签:' hello',内容:' Hello World'

部分:'管理员',输入:'按钮',标签:'再见',内容:'再见残酷的世界'

lang_DE:

部分:' admin',输入:'按钮',标签:' hello',内容:' Hallo Welt'

表的主键是(section,type,label)的组合。没有其他索引 - 这是由于在重复密钥更新查询中使用插入来填充和更新语言表的方式。

由于服务器约束限制,必须在单个查询中完成。我坚持认为唯一可行的方法是通过

的联盟

SELECT content FROM language_EN WHERE section =' admin' AND type ='按钮'

UNION DISTINCT

SELECTcontent FROM language_DE WHERE section =' admin' AND type ='按钮'

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

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

任何指针都会非常感激。

2 个答案:

答案 0 :(得分:0)

我会建议这种方法:

(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缺少重复项。其次,它使用索引,并且没有昂贵的重复删除操作。

答案 1 :(得分:0)

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

SELECT content FROM language_EN WHERE section =' admin' AND type ='按钮'

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

UNION

SELECT content FROM language_DE WHERE section =' admin' AND type ='按钮'