连接5个表 - 1个主数据加4个多行到主数据库但主数据重复

时间:2013-12-16 22:04:43

标签: mysql join concatenation

我在mysql中使用查询,但我是新手。我正在加入5个表,其中每个表都有一个标识符,一个表是主表。每个相关表可以具有多个与主表相关联的记录。我试图加入这些表,但我似乎无法摆脱重复的数据。

我希望显示所有相关记录,但我不希望主表中的数据显示在相关表中的所有结果中。我尝试了很多不同的方法但没有任何效果。目前我有4个查询适用于单独的表,但我没有成功加入它们,结果显示相关表中的多个记录,但只显示主表中的一个记录。

以下是我的个人查询:

SELECT 
    GovernmaxAdditionsExtract.AdditionDescr, 
    GovernmaxAdditionsExtract.BaseArea, 
    GovernmaxAdditionsExtract.Value
FROM 
    GovernmaxExtract 
    INNER JOIN GovernmaxAdditionsExtract 
        ON GovernmaxExtract.mpropertyNumber = GovernmaxAdditionsExtract.PropertyNumber
WHERE (((GovernmaxExtract.mpropertyNumber)="xxx-xxx-xx-xxx"));

SELECT 
    GovernmaxExtract.mpropertyNumber, 
    GovernmaxDwellingExtract.CardNumber, 
    GovernmaxDwellingExtract.MainBuildingType, 
    GovernmaxDwellingExtract.BaseArea
FROM 
    GovernmaxExtract INNER JOIN 
    GovernmaxDwellingExtract ON GovernmaxExtract.mpropertyNumber = GovernmaxDwellingExtract.PropertyNumber
WHERE (((GovernmaxExtract.mpropertyNumber)="xxx-xxx-xx-xxx"));

使用这些子查询,我试图将其中两个表放在一起,但现在我得到了所有记录并且它没有读取我的输入参数:

SELECT GE.mpropertynumber
FROM 
    GovernmaxExtract AS GE, 
    (SELECT 
         GovernmaxAdditionsExtract.AdditionDescr, 
         GovernmaxAdditionsExtract.BaseArea, 
         GovernmaxAdditionsExtract.Value
     FROM GovernmaxExtract INNER JOIN 
         GovernmaxAdditionsExtract ON 
         governmaxextract.mpropertyNumber = GovernmaxAdditionsExtract.PropertyNumber) AS AE
WHERE GE.mpropertynumber = 'xxx-xxx-xx-xxx'

我尝试了嵌套查询,许多不同的连接,而我只是无法解决这个问题。我很确定我想要进行嵌套查询,因为我希望Governmax表中的主数据显示一次主数据和所有记录以及相关表的所有信息。也许我错了。

我们的原始代码是:

SELECT 
    ge.*, 
    gde.*, 
    gfe.*, 
    gae.*, 
    goie.* 
FROM governmaxextract AS ge 
    LEFT JOIN governmaxdwellingextract AS gde 
        ON ge.mpropertyNumber = gde.PropertyNumber 
    LEFT JOIN governmaxfeaturesextract AS gfe
        ON gde.PropertyNumber = gfe.PropertyNumber  
    LEFT JOIN governmaxadditionsextract AS gae
        ON gde.PropertyNumber = gae.PropertyNumber  
    RIGHT JOIN governmaxotherimprovementsextract AS goie 
        ON gde.PropertyNumber = goie.PropertyNumber
WHERE ge.mpropertyNumber = '$codeword'   
ORDER BY goie.CardNumber

但是这会为主表提供关联表中每条记录的多行。我考虑过连接,但我需要单独显示相关表中的数据。不知道下一步该尝试什么。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

抱歉,没有办法像你想的那样做。 JOIN不能那样做。

我建议使用单独的查询来保持解决方案。

Btw - 您可以使用UNION运算符, http://en.wikipedia.org/wiki/Union_(SQL)#UNION_operator

P.S。

您可以单独提取主数据,然后使用UNION一次从相关表中提取数据。使用UNIOM,它将在相关表中的每一行中给出一个结果行。

答案 1 :(得分:0)

为了将两个Detail表连接在一起而不生成重复行,您必须对每个表执行以下操作:

  

将主表的外键分组,并聚合投影到连接上的所有其他列。

数字列通常与SUM(),COUNT(),MAX()和MIN()聚合在一起。 MAX()和MIN()也适用于字符数据。对于这种情况,PIVOT操作有时也可用作聚合运算符。

一旦您以这种方式对两个详细信息表进行分组和聚合,它们将无需重复即可加入。通过首先以相同的方式对其进行分组和聚合,可以将其他详细信息表添加到连接中。