Php 选择具有复合关键点的独立联合

Php 选择具有复合关键点的独立联合,php,mysql,pdo,union,composite-primary-key,Php,Mysql,Pdo,Union,Composite Primary Key,所以, 我当前的问题是从php/pdo/mysql创建一个语言文件。有多个结构相同的语言表,但应用程序每次运行仅使用2个-一个可能不完整的用户选择语言和一个完整的回退语言。现在我们假设英语表是完整的,但是任何翻译表都可能不是,所以我们希望从英语表返回任何缺少的翻译 因此,假设表是lang_EN和lang_DE,包含列section、type、label和content 朗恩: 部分:'admin',类型:'button',标签:'hello',内容:'hello World' 部分:“管理员”,

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

因此,假设表是lang_EN和lang_DE,包含列section、type、label和content

朗恩:

部分:'admin',类型:'button',标签:'hello',内容:'hello World'

部分:“管理员”,类型:“按钮”,标签:“再见”,内容:“再见残酷世界”

朗德:

部分:'admin',类型:'button',标签:'hello',内容:'Hallo Welt'

表的主键是节、类型和标签的组合。不能有其他索引-这是由于使用insert on duplicate key update查询填充和更新语言表的方式造成的

由于服务器限制,它必须在单个查询中完成。我一直在想,唯一能做到这一点的方法就是通过一个遵循

从语言中选择内容 其中section='admin' 和类型='button'

联合独立

从语言中选择内容 其中section='admin' 和类型='button'

预期结果如下: 哈罗贴边 再见残酷的世界

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


任何建议都将不胜感激。

我建议采用以下方法:

(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
                  )
)

与您的方法相比,有两个优势。首先,您可以选择其他列,而不必担心缺少重复项。其次,它使用索引,并且没有昂贵的重复删除操作。

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

从language_EN中选择内容,其中section='admin'和type='button'

其中节、类型、标签不在“从语言中选择节、类型、标签”

联合


从language_DE中选择内容,其中section='admin'和type='button'

谢谢。我应该好好考虑一下,但是不行。我采用了这种方法,它只返回语言表的结果。@MrBob。也就是说,第二个子查询没有返回任何内容。这是真的吗?是的。我可以看到它的方向,你启发我使用行子查询得到下面的答案。@Bob先生。我没注意到标签是你要找的钥匙的一部分。