簡體   English   中英

3 表左外連接不適用於子查詢

[英]3 table left outer join doesn't work with subquery

簡要說明...我有 4 張桌子。 “聯系人”(每個人的列表,唯一 ID)、contact_phones(每個聯系人的多個電話號碼,加入 contact_id)和contact_communication(每次我們與此聯系人交談時,加入 contact_id)和學校(a學校列表,加入schools.school_id = contacts.contact_id)。

我需要什么:我需要查找一所單獨的學校。 對於那所學校,我需要一份去那里的每個人的名單,他們的主要電話號碼,以及我們與他們的最后一次聯系(如果有的話)。

問題是,如果我們沒有與他們溝通,他們就不會出現在列表中。 如果我去掉“WHERE”子句中的“AND”語句,那么我得到的通信記錄不止一個。 我只想要最新的通訊記錄,但我想要所有的聯系人。 但有些聯系人沒有通訊記錄。

這是我的查詢:

SELECT c.id,
            c.f_name,
            c.l_name,
            c.address1,
            c.address2,
            c.city,
            c.state,
            c.zip,
            c.tel,
            c.school_id,
            c.email,
                ct.tel,
                cc.date,
                cc.reason,
                cc.result,
                cc.caller
                FROM contacts AS c
                LEFT OUTER JOIN contact_phones AS ct ON c.id = ct.contact_id
                LEFT OUTER JOIN contact_communication AS cc ON c.id = cc.contact_id 
            WHERE school_id = '$schoolId' AND 
                cc.id IN (SELECT MAX(id) FROM contact_communication WHERE contact_id = c.id)
                ORDER BY cc.date DESC

問題是,這個查詢只給我最新的通信(這就是我想要的),但不會列出沒有通信的聯系人。

我已經在這呆了3天。 有小費嗎?

謝謝!!

(PS:如果需要,我會編輯並提供更多信息。)

編輯答案(謝謝,ysrb)正在改變我的 where 子句:

SELECT c.id,
            c.f_name,
            c.l_name,
            c.address1,
            c.address2,
            c.city,
            c.state,
            c.zip,
            c.tel,
            c.school_id,
            c.email,
                ct.tel,
                cc.date,
                cc.reason,
                cc.result,
                cc.caller
                FROM contacts AS c
                LEFT OUTER JOIN contact_phones AS ct ON c.id = ct.contact_id
                LEFT OUTER JOIN contact_communication AS cc ON c.id = cc.contact_id 
            WHERE school_id = '$schoolId' AND 
                (cc.id IN (SELECT MAX(id) FROM contact_communication WHERE contact_id = c.id) OR cc.id IS NULL) 
                ORDER BY cc.date DESC

嘗試:

SELECT c.id,
            c.f_name,
            c.l_name,
            c.address1,
            c.address2,
            c.city,
            c.state,
            c.zip,
            c.tel,
            c.school_id,
            c.email,
                ct.tel,
                cc.date,
                cc.reason,
                cc.result,
                cc.caller
                FROM contacts AS c
                LEFT OUTER JOIN contact_phones AS ct ON c.id = ct.contact_id
                LEFT OUTER JOIN contact_communication AS cc ON c.id = cc.contact_id 
            WHERE school_id = '$schoolId' AND 
                (cc.id = (SELECT MAX(id) FROM contact_communication WHERE contact_id = c.id) OR cc.ID IS NULL)
            ORDER BY cc.date DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM