2012-11-07 244 views
2

我是關係表的新手。隨着我學到更多,我看到了sql語句的許多優點。但是我堅持了一些觀點。mysql嵌套select語句

我查找是否可以從5個表中獲得所需數據集的單個表。名爲'eta'的表格之一用於連接其他4個表格。

目標: 許多用戶都可以使用電話號碼或電子郵件,用戶也可能有多個電話號碼或電子郵件地址。我想用使用它們的用戶名列出電話號碼或電子郵件地址。

樣本數據: 請檢查http://sqlfiddle.com/#!2/60acce的表結構和樣本數據集

的電話情況下,按照最終的預期最終結果:

phone   name extra 
    45336467  ABC Co. 
    45336467  Gery  114 
    45336467  Todd  117 
    45336467  Adam  119 

感謝

編輯:表關係的解釋。

表'eta'有4個有表格關係的字段。列「自己的」顯示了公司,個人等價值公司「f」和「K」的人別人會用不同的表

v1_id爲自己的領域的簡稱表的ID ..

列「水庫」指電子郵件和電話表。電話的值爲't',電子郵件的'e'。 v2_id對資源領域的簡稱表

+2

能否請你解釋一下表之間的關係? –

+0

'eta'與其他表格有什麼關係?什麼是返回上述標準?如果一個人可以有多個電話號碼,您想要返回哪一個? – Taryn

+0

具體來說,'eta'表上的字段與其他表的關係如何 – Lamak

回答

3

的ID通過您的模式立案後,我認爲以下查詢應該爲你工作:

SELECT 
    phone.tel AS phone, 
    CASE WHEN person.name IS NULL THEN company.titles ELSE person.name END AS name, 
    eta.extra AS extra 
FROM 
    eta 
    LEFT JOIN person 
     ON eta.v1_id = person.id 
     AND eta.own = 'k' 
    LEFT JOIN company 
     ON eta.v1_id = company.id 
     AND eta.own = 'f' 
    JOIN phone 
     ON phone.id = eta.v2_id 
WHERE 
    eta.res = 't' 

這假定eta.res = 't'如果關係到「手機」表。另外,eta.own = 'k'爲人,eta.own = 'f'爲公司。

它使用兩個左連接從person/company表中拉出,以便它可以在單個查詢中完成拉取操作。如果person.name列爲空,則表示當前記錄來自company表,並將選擇該值(對於名稱列)。

同樣可以做選擇的電子郵件地址(假設eta.res = 'e'涉及到電子郵件表):

SELECT 
    email.email AS email, 
    CASE WHEN person.name IS NULL THEN company.titles ELSE person.name END AS name 
FROM 
    eta 
    LEFT JOIN person 
     ON eta.v1_id = person.id 
     AND eta.own = 'k' 
    LEFT JOIN company 
     ON eta.v1_id = company.id 
     AND eta.own = 'f' 
    JOIN email 
     ON email.id = eta.v2_id 
WHERE 
    eta.res = 'e' 
+0

它完美地工作,請檢查[SQL Fiddle代碼。](http://sqlfiddle.com/#!2/60acce/21)+1 「猜測」關係,我仍然猜測你何時發佈答案 – Yaroslav

+0

太棒了!它工作完美。我們可以通過爲「部門」添加一個表格來使用它。它檢查空狀態,如果有三個表呢? – aliaktas

+1

@aliaktas是的,你應該可以添加更多的表格,只要你想。對於每個表,您只需添加'LEFT JOIN new_table ON eta.v1_id = new_table.id AND eta.own ='?''。此外,您需要更改'CASE'語句以支持它'CASE WHEN person.name IS NOT NULL THEN person.name WHEN company。title不爲NULL THEN company.titles ELSE new_table.name_field END AS name'(注意,我在此將其更改爲「IS NOT NULL」) – newfurniturey