可以提取我正在寻找的数据的MySQL查询?

时间:2010-06-16 15:12:44

标签: sql mysql join left-join

在我正在进行的项目中,我坚持使用哈迪斯的桌面结构。要牢记两件事:

  1. 我现在无法更改表格结构。我暂时坚持下去。
  2. 查询是动态生成的,不是硬编码的。所以,当我要求一个可以提取这些数据的查询时,我真正努力的是一种算法,它将生成我需要的查询。
  3. 希望我可以解释这个问题,而不会让你的眼睛睁开眼睛,你的大脑会崩溃。

    我们有一个实例表,它沿着这些行看起来(简化):

    Instances
    InstanceID    active
    1              Y
    2              Y
    3              Y
    4              N
    5              Y
    6              Y
    

    然后,沿着这些行有多个数据表:

    Table1
    
    InstanceID    field1   reference_field2
    1             John      5
    2             Sally        NULL
    3             Fred          6
    4             Joe          NULL
    
    
    Table2
    InstanceID    field3 
    5              1
    6              1
    
    
    Table3
    InstanceID    fieldID    field4
    5               1        Howard
    5               2        James
    6               2        Betty
    

    请注意,Table1中的reference_field2包含对另一个实例的引用。 表2中的Field3有点复杂。它包含表3的fieldID。

    我需要的是一个查询,它将为我提供如下列表:

    InstanceID    field1     field4     
    1              John      Howard
    2              Sally
    3              Fred
    

    问题是,在我目前的查询中,我没有得到Fred,因为表3中没有关于fieldID 1和InstanceID 6的条目。所以,到目前为止我能够得到的最好的列表是

    InstanceID    field1     field4     
    1              John      Howard
    2              Sally
    

    本质上,如果表1中有一个表2的字段,并且表3中没有一个条目,其中instanceID包含在field2中,而字段ID包含在field3中,我没有从field1获取数据

    我已经看过连接,直到我脸色发青,当table3没有条目时,我看不到处理这种情况的方法。

2 个答案:

答案 0 :(得分:2)

LEFT JOIN ...

SELECT a.InstanceID, b.field1, d.field4
FROM instances AS a 
    JOIN Table1 AS b ON a.InstanceID = b.InstanceID
    LEFT JOIN Table2 AS c ON b.reference_field2 = c.InstanceID
    LEFT JOIN Table3 AS d ON (c.InstanceID = d.InstanceID AND c.field3 = d.fieldId)
WHERE a.active = 'Y'

两个左连接应该处理没有其他行的情况......

答案 1 :(得分:1)

如果你发布了你的查询会有所帮助,因为我觉得你在这里的表格描述中有一些错误,所以不清楚这些表是如何连接的。

无论如何,您的查询中可能有内部联接(通常只写为JOIN)。将其替换为左外连接(LEFT JOIN)。它不需要右表包含行并返回NULL而不是实际值。