2011-05-02 44 views
0

我是SQL編程的新手,並且有點麻煩。我有以下MySQL的腳本:有條件的NULL列的MySQL SELECT

SELECT 
    MyPrimaryTable.PrimaryKey, Alias1.String AS Output1, 
    CASE 
     WHEN Id2 IS NOT NULL THEN Alias2.String 
     ELSE "" 
    END AS Output2 
FROM MyPrimaryTable, MySecondaryTable AS Alias1, MySecondaryTable AS Alias2 
WHERE 
    MyPrimaryTable.Id1 = Alias1.Id1 
    AND ((MyPrimaryTable.Id2 IS NULL) OR (MyPrimaryTable.Id2 = Alias2.Id2)); 

基本上,我有一個包含兩個ID,ID1和ID2一個主表,和我想這些ID的每一個用細繩在二次表及關聯在SELECT結果中顯示這些字符串。但是,主表中的第二個ID允許爲NULL。在這種情況下,我希望的輸出是預期的第一個字符串,第二個字符串爲空(「」)。我寫的腳本是這樣做的,只是它爲每個可能的字符串添加了一個新行,儘管所有行看起來都是一樣的。

預期結果有可能的字符串Foo1和Foo2,Foo3和Foo4,與表中的兩個條目:

PK Output1 Output2 
1 Foo1 Foo4 
2 Foo2 

我得到什麼:

1 Foo1 Foo4 
2 Foo2 
2 Foo2 
2 Foo2 

如何清潔這並讓它按預期工作?謝謝。

編輯:我希望不要使用DISTINCT,因爲我想在VIEW中使用它,而DISTINCT將使視圖不可更新。

+0

你有沒有考慮GROUP_CONCAT()? http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat – 2011-05-02 08:23:08

回答

1

嘗試

GROUP BY MyPrimaryTable.PrimaryKey 

在另一端分組,您可以加入表中沒有與WHERE

SELECT 
    MyPrimaryTable.PrimaryKey, 
    Alias1.String AS Output1, 
    CASE 
     WHEN Id2 IS NOT NULL THEN Alias2.String 
     ELSE "" 
    END AS Output2 
FROM MyPrimaryTable, 
    LEFT JOIN MySecondaryTable AS Alias1 ON MyPrimaryTable.Id1 = Alias1.Id1 
    LEFT JOIN MySecondaryTable AS Alias2 ON MyPrimaryTable.Id2 = Alias2.Id2 
+0

謝謝! LEFT JOIN正是我所期待的。 – RawwrBag 2011-05-02 09:22:29

+0

不幸的是,這似乎並沒有正確更新時使用的視圖,IE瀏覽器,如果我嘗試'更新Output1 SET String =「測試」WHERE PrimaryKey = 1234'它似乎用「測試」替換原始字符串的所有實例,而不是就在PK是1234的地方。離開你的頭頂,你知道這可能是爲什麼嗎? – RawwrBag 2011-05-02 09:45:07

+0

沒關係,忽略最後一條評論,我很笨 - 我不得不編輯原始數字,而不是相關的字符串。 Durp。 – RawwrBag 2011-05-02 09:46:28