2010-06-16 25 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

相關問題