2010-06-16 69 views
3

在我正在进行的项目中,我被卡住了来自Hades的桌子结构。有两件事要记住:MySQL查询可以拉我正在寻找的数据?

  1. 我现在无法更改表结构。我暂时坚持下去。
  2. 查询是动态生成的,不是硬编码的。所以,当我要求一个可以提取这些数据的查询时,我真正努力的是一个将生成我需要的查询的算法。

希望我能解释这个问题,不要让你的眼睛眩晕,你的大脑内爆。

我们沿着这些线路,看起来(简体)的实例表:

 
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 

请注意,reference_field2在表1中包含对另一个实例的引用。 Table2中的Field3稍微复杂一些。它包含了一个表3. fieldID

我需要的是一个查询,将让我的列表如下:

 
InstanceID field1  field4  
1    John  Howard 
2    Sally 
3    Fred 

的问题是,在查询目前我有,我没有得到弗雷德因为在表3为fieldID 1和实例id 6.没有条目所以,最好的名单我已经能够获得迄今是

 
InstanceID field1  field4  
1    John  Howard 
2    Sally 

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

我已经看过连接,直到我在脸上变得蓝色,而当table3没有条目时,我看不到处理这种情况的方法。

+0

MySQL允许OUTER JOINS? – FrustratedWithFormsDesigner 2010-06-16 15:20:54

回答

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' 

两个左联接应如何处理在没有其他行的情况下...

+0

您的查询有一个问题。我需要要求表3中的fieldID与表2中为实例列出的FieldID相同。而且,这似乎是在我的结果中关闭了Fred的WHERE子句。 – 2010-06-16 15:30:13

+0

首先,连接确实要求表3中的fieldID与表2中的fieldID相同(这是table3连接的ON子句的第二部分)。如果WHERE子句消灭Fred(根据您的示例数据,它不应该是),那么对于fred来说可能'active'真的是“Y”(带有空格)?或者不只是一个简单的'Y'... ...? – ircmaxell 2010-06-16 15:34:47

+0

我认为我开始根据您发布的内容查看解决方案的路径。我需要删除Where子句并使用join语法。实际的查询比这个例子要难得多,但我想我现在看到了一丝如何去做的感谢谢谢。 Amy – 2010-06-16 15:50:10

1

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

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

+0

我能得到实际的查询最接近的是 SELECT Instances.InstanceID,Table1.field1,Table3.field4从实例中 LEFT JOIN表1 ON Instances.InstanceID = Table1.InstanceID LEFT JOIN表2 ON Instances.InstanceID =表1。 fieldID2 LEFT JOIN Table3 ON Table2.InstanceID = Table3.InstanceID WHERE Instances.active ='Y'AND(Table3.fieldID = Table2.fieldID OR Table1.field2 IS NULL)ORDER BY Table1.field1 asc 实际查询是因为表名都是动态生成的,所以更加神秘。 – 2010-06-16 15:47:00

+0

那么,没有看到确切的表格就很难提供帮助。例如,在这里您加入“Instances.InstanceID = Table1.fieldID2”上的表格。这对我来说没有意义,它与你在这个问题上写的不同。 – 2010-06-16 15:52:44

相关问题