Mysql 以复杂的方式组合两个表

Mysql 以复杂的方式组合两个表,mysql,sql,Mysql,Sql,情况: 我有主表,我们把它叫做MainTable +---------+----------+----------+----------+ | Id (PK)| Title | Text | Type | +---------+----------+----------+----------+ | 1 | Some Text|More Stuff| A | | 2 | Another | Example | B

情况:

我有主表,我们把它叫做
MainTable

+---------+----------+----------+----------+ 
|  Id (PK)| Title    | Text     | Type     |
+---------+----------+----------+----------+ 
|   1     | Some Text|More Stuff| A        | 
|   2     | Another  | Example  | B        | 
+---------+----------+----------+----------+ 
我还有第二个表,名为
TranslationsTable
,其中Id字段表示
MainTable
行Id(没有外键,因为它可以引用不同的表),ObjType是ObjectType(与表同名),FieldName是ObjectType中字段的名称,该值具有ObjType表中FieldName值的转换值

+---------+-----------+-----------+------------+----------+
|   Id    | ObjType   | FieldName | Value      | Language |
+---------+-----------+-----------+------------+----------+
|   1     | MainTable | Title     | Algum Texto| PT       |
|   1     | MainTable | Text      | Mais Coisas| PT       |
+---------+-----------+-----------+------------+----------+
因为我需要在翻译后的字段中搜索,我想我可以使用
临时表
来完成,但随后出现了“我应该使用哪个SELECT查询”的问题。我读了一些关于pivot表查询的帖子,但是我真的不知道如何构建一个查询,这样我的临时表就像

+---------+------------+------------+----------+ 
|  Id (PK)| Field_1    | Field_2    | Field_3  |
+---------+------------+------------+----------+ 
|   1     | Algum Texto| Mais Coisas| A        |  
+---------+------------+------------+----------+ 
多谢各位

编辑:

我接受了AD7six答案,因为对于主表中的500000个条目和翻译中的1500000个条目,它大约比另一个快30倍

SELECT
  orig.Id,
  COALESCE(xlate.Field_1, orig.Field_1) AS Field_1,
  COALESCE(xlate.Field_2, orig.Field_2) AS Field_2,
  COALESCE(xlate.Field_3, orig.Field_3) AS Field_3
FROM MainTable orig
INNER JOIN (
  SELECT
    Id,Field_1,Field_2,Field_3
  FROM TranslationsTable
  PIVOT(MIN(Value) FOR FieldName IN (Field_1,Field_2,Field_3)) p
  WHERE ObjType = 'MainTable'
) xlate ON (orig.Id = xlate.Id)
如果要包括MainTable中在TranslationTable中不匹配的(未翻译的)行,请将内部联接更改为左外部联接

另一种选择是手动执行枢轴:

SELECT
  orig.Id,
  COALESCE(xlate.Field_1, orig.Field_1) AS Field_1,
  COALESCE(xlate.Field_2, orig.Field_2) AS Field_2,
  COALESCE(xlate.Field_3, orig.Field_3) AS Field_3
FROM MainTable orig
INNER JOIN (
  SELECT
    Id,
    MIN(CASE FieldName WHEN 'Field_1' THEN Value END) AS Field_1,
    MIN(CASE FieldName WHEN 'Field_2' THEN Value END) AS Field_2,
    MIN(CASE FieldName WHEN 'Field_3' THEN Value END) AS Field_3
  FROM TranslationsTable 
  WHERE ObjType = 'MainTable'
  GROUP BY Id
) xlate ON (orig.Id = xlate.Id)
通过像其他人建议的那样更改MainTable模式,您不需要重复(字段_1、字段_2、字段_3)。它使代码更易于维护和修改。

这并不复杂 这只是一个查询,每个翻译字段有一个连接

这意味着您可以查询/排序/任何与其他类似的内容,例如(使用一些实名以便更容易阅读):

您不需要临时表 但是,如果您想创建一个查询,使用查询本身很容易:

CREATE TABLE
    products_pt
AS
SELECT
    products.id,
    COALESCE(product_name.value, products.name) as name,
    COALESCE(product_description.value, products.description) as description
...

这将创建一个与查询结构匹配的表(无索引)。如果您的数据不经常更改,则查询您的多语言数据会更容易管理,但也有一些缺点,例如(显然)如果源表数据更改,您的翻译特定表将无法更新。

感谢您(非常快速)的回答。我会马上试用,然后告诉你。我在第10行发现一个语法错误。MySQL中有一个PIVOT吗?我用MAX(IF(I.FieldName='Field_1',I.Value,NULL))作为Field_1来完成它,这样会更好吗?实际上,字段名称应该是动态的,但即使在PHP中这样做,我也可以管理。我的“CASE FieldName WHEN'Field_1'THEN Value END”逻辑上等同于“IF(FieldName='Field_1',Value,NULL)”,所以没有区别,它有一个主键。它的Id-ObjType-FieldName(葡萄牙语中各自的名称)没有使用该语言,但它是Id-ObjType-FieldName-language虽然您的代码工作起来很有魅力,但我注意到它比Anon的选项稍慢。我将测试哪一个在更大的表中性能更好(我的翻译表倾向于有很多行)。太糟糕了,我不能同时选择两个答案,我将不得不接受一个更适合我的答案。至少你们两个都会得到一个向上的投票:)如果你能取消使用COALESCE,这可能会使它更快。不要忘记在查询中使用explain来检查优化;如果是tmp表查询,肯定有改进的余地。事实证明,我在这方面可能是错的。phpMyAdmin报告Anon的代码为0.0005秒,你的方法为0.0010秒。但我在Anon的代码中使用了临时表,而不是在你的代码中。当我只使用SELECT和no tem表时,它报告Anon的方式为0.0072。这相当慢。我得进一步调查,也许会接受你的回答。
CREATE TABLE
    products_pt
AS
SELECT
    products.id,
    COALESCE(product_name.value, products.name) as name,
    COALESCE(product_description.value, products.description) as description
...