2013-03-02 52 views
0

我有3個表,每個表只有2行。 T1(id,名稱),T2(id,電子郵件),T3(id,電話)。 T1在id1和id2都有註冊,T2只在id1註冊,id2在電子郵件沒有註冊(null)。 T3在id1和id2上都有註冊。 我想加入T1,T2和T3的某些條件(名稱如'%etc%')。結果應該是一個帶有(姓名,電子郵件,電話)的表格,但是如果其中一個連接表格中的註冊爲NULL(例如T2 id2(email)爲NULL),我希望結果是隻有(名稱,電話)(T1 + T3,因爲T2在id2處有一個空註冊)...如果列的註冊不是NULL,則在多個內部連接上有某種類型。 謝謝。如果有任何註冊,mysql會連接多個表

+0

請出示你嘗試過什麼。 – SilentAssassin 2013-03-02 17:42:35

回答

0

我認爲你需要考慮使用LEFT JOINs

SELECT T1.Name, T2.Email, T3.Phone 
FROM T1 
    LEFT JOIN T2 ON T1.id=T2.id 
    LEFT JOIN T3 ON T1.id=T3.id 

這將從表T1返回所有的記錄,只有那些從T2和T3匹配。其他字段將爲NULL。

然而,如果你想只有那些符合條件的,然後使用內部連接,而不是:

SELECT T1.Name, T2.Email, T3.Phone 
FROM T1 
    INNER JOIN T2 ON T1.id=T2.id 
    INNER JOIN T3 ON T1.id=T3.id 

這隻會返回匹配的記錄。

如果一條記錄爲NULL,那麼你只會返回2列的評論 - 我不認爲這是你想採取的方法。返回你的所有列,並在你的演示文稿中處理這些事情。如果你真的想要動態列,那麼你需要考慮使用動態SQL。

- 編輯 -

動態SQL方法:

SET @id = 2; 
SET @sql = NULL; 

SELECT 
    CONCAT(
     CASE WHEN EMail IS NOT NULL THEN 'Email' ELSE '' END, 
     CASE WHEN EMail IS NOT NULL AND Phone IS NOT NULL THEN ',' ELSE '' END, 
     CASE WHEN Phone IS NOT NULL THEN 'Phone' ELSE '' END) 
    INTO @sql 
FROM T1 
    LEFT JOIN T2 ON T1.id=T2.id 
    LEFT JOIN T3 ON T1.id=T3.id 
WHERE T1.Id = @id; 

SET @sql = CONCAT('SELECT Name, ', @sql, ' 
        FROM T1 
         LEFT JOIN T2 ON T1.id=T2.id 
         LEFT JOIN T3 ON T1.id=T3.id 
        WHERE T1.Id = ',@id); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle Demo

+1

* ...但如果其中一個連接表中的註冊爲NULL(例如T2的id2(email)爲NULL),我希望結果是隻有(名稱,電話)的表(T1 + T3,因爲T2有id2的空註冊)... * - 這怎麼可以返回兩列例如? – Ambrose 2013-03-02 17:28:05

+0

@MachoPaay - 好點,不太清楚OP在問什麼。我將發佈關於返回不同列的編輯。 – sgeddes 2013-03-02 17:29:41

+0

無論如何,你的答案似乎很好,因爲你不能動態地返回每次執行不等列,除非OP是創建動態SQL。 – Ambrose 2013-03-02 17:31:02