查询这3个表时为什么会看到重复项?

时间:2013-08-31 16:04:22

标签: mysql

我有以下架构,只显示相关列:

Table 1 - Metainfo
attrName
attrValue
instanceId

Table 2 - PrimaryData
attrName
attrValue
metaInstanceId

Table 3 - AuditData
result
metaInstanceId

在Metainfo中,一行是attrName ='timestamp',attrValue ='2012-01-01 12:00:01'。这样有多行具有不同的时间戳,因此具有不同的instanceIds。该表包含我们对我的问题不感兴趣的其他元信息,如主机名。

我的查询基于此时间戳属性。我想通过独特的时间戳加入所有3个表。我先试了一下:

SELECT meta.attrValue AS metaval, p.attrName AS configname, p.attrValue AS configvalue,      
       a.result AS auditresult FROM Metainfo meta 
                                    INNER JOIN PrimaryData p
                                        ON meta.instanceId = p.metaInstanceId 
                                    INNER JOIN AuditData a 
                                        ON meta.instanceId = a.metaInstanceId 
                                    WHERE meta.attrName='timestamp' 
                                    ORDER BY configname, metaval;

我认为这给了我重复的结果,因为Metainfo与PrimaryData是多对多的关系,然后与AuditData结合的结果表最终会导致更多的关系。所以我试过这个:

SELECT m.attrValue AS metaval, p.attrName AS configname, p.attrValue AS configvalue,  
       a.result AS auditresult FROM Metainfo m, PrimaryData p, AuditData a 
                                    WHERE m.attrName='timestamp' AND  
                                    m.instanceId=p.metaInstanceId=a.metaInstanceId  
                                    ORDER BY configname, metaval;

我不明白为什么这个STILL会给我重复。我想我是说,“从3个表中获取处理时间戳元数据的各个列,然后按配置名称,然后按时间戳将它们分组”。

***TABLE Metainfo:***
*attrName    attrValue                               instanceId*
host        https://www.site1.com                   1
timestamp   2013-08-02 16:04:20.142                 1
host        https://www.site2.com                   2
timestamp   2013-08-05 01:00:11.001                 2
host        https://www.site3.com                   3
timestamp   2013-08-05 02:09:01.782                 3

**TABLE PrimaryData:**
*attrName        attrValue        metaInstanceId*
portNum         80                1
serverName      pegasus           1
inUse           F                 1
portNum         400               2
serverName      hercules          2
inUse           T                 2
portNum         4040              3
serverName      colossus          3
inUse           T                 3

**TABLE AuditData**
*result          metaInstanceId*
Pass             1
Pass             1
Fail             1
Pass             2
Pass             2
Pass             2
Fail             3
Pass             3
Pass             3

AuditData中的每一行都告诉我们PrimaryData中的配置是否通过了某些测试。有3次配置测试3次,这就是为什么PrimaryData和AuditData有9行。这些表中的每一个都有我未显示的列,以使事情变得更容易。我想要一个查询,它给我时间戳值,配置名称,配置值和结果。因此,在显示的示例数据中,此查询将导致:

timestampVal                configName    configValue    result
2013-08-02 16:04:20.142     portNum       80             Pass
2013-08-05 01:00:11.001     portNum       400            Pass
2013-08-05 02:09:01.782     portNum       4040           Fail
2013-08-02 16:04:20.142     serverName    pegasus        Pass
2013-08-05 01:00:11.00      serverName    hercules       Pass
2013-08-05 02:09:01.782     serverName    colossus       Pass
2013-08-02 16:04:20.142     inUse         F              Fail
2013-08-05 01:00:11.001     inUse         T              Pass
2013-08-05 02:09:01.782     inUse         T              Pass

1 个答案:

答案 0 :(得分:0)

你应该考虑GROUP BY

    WHERE meta.attrName='timestamp' 
    GROUP BY metaval
    ORDER BY configname, metaval;

或使用您不希望在

组中重复的列
相关问题