2014-01-12 30 views
0

我有3個表。Mysql選擇列爲空如果不加入

  • 第一個是引用聯繫人的用戶表。
  • 其次是聯繫人行表,其中包含電子郵件地址和對聯繫人的引用。
  • 第三張表保存信息,如何使用聯繫人行並引用聯繫人行。

在這種情況下,我試圖從用戶表中獲取記錄並將emailaddress設置爲它,如果它存在並且設置了正確的使用類型。如果聯繫人行爲空或未設置使用類型,則仍應返回結果,在這種情況下,電子郵件地址應爲空。

表1

  • ID
  • f_contact

表2

  • ID
  • F_TYPE
  • f_contact

表3

  • ID
  • table2_id
  • F_TYPE

每當有完整的柴n在所有這些表中的記錄中起作用,但是當表2沒有任何記錄或表3沒有對Table2的正確引用時,它不返回任何內容。

  • 表1總是排
  • 表2可以有一個或多個行
  • 表3可以有1參照表2排

我現在是這樣的:

SELECT 
    Table1.*, 
    Table2.value AS emailaddress 
FROM 
    Table1 
    LEFT JOIN Table2 
    ON Table2.f_contact = Table1.f_contact 
    LEFT JOIN Table3 
    ON Table3.table2_id = Table2.id 
WHERE Table1.f_contact = 1113 
    AND Table2.f_type = 2 
    AND Table3.f_type = 3 

回答

1

這很難說沒有看到樣本數據和期望的輸出,但你可以嘗試這樣

SELECT 
    Table1.*, 
    CASE WHEN Table3.f_type IS NULL THEN NULL ELSE Table2.value END AS emailaddress 
FROM 
    Table1 
    LEFT JOIN Table2 
    ON Table2.f_contact = Table1.f_contact 
    AND Table2.f_type = 2 
    LEFT JOIN Table3 
    ON Table3.table2_id = Table2.id 
    AND Table3.f_type = 3 
WHERE Table1.f_contact = 1113 

這裏是SQLFiddle演示

+0

這幾乎是它的釘子。它返回一行與emailaddress的值和null,具體情況。但是當表3中沒有引用記錄時,emailaddress應該爲空總是在這種情況下 – makallio85

+0

期望的輸出是:id => int,f_contact => int,emailaddress => null或字符串 – makallio85

+0

查看更新的答案。 – peterm

3

將條件從where條款移至ON條款

SELECT 
    Table1.*, 
    Table2.value AS emailaddress 
FROM 
    Table1 
    LEFT JOIN Table2 
    ON Table2.f_contact = Table1.f_contact AND Table1.f_contact = 1113 
    LEFT JOIN Table3 
    ON Table3.table2_id = Table2.id AND Table2.f_type = 2 AND Table3.f_type = 3 
+0

這似乎返回從表1中的所有記錄,而不是具有f_contact = 1113的行。匹配來自Table3的其他f_types的行。 – makallio85

+0

您只需將'table2'和'table3'的條件移入連接條件。 「Table1.f_contact = 1113」應該保留在「where」條款中。我也會(爲了清楚起見)將'AND Table2.f_type = 2'移入'table2'的連接子句中,而不是'table3'中的連接子句。 –