2011-07-16 14 views
0

簡単な説明...私は4つのテーブルを持っています。 contact_phones(各連絡先の複数の電話番号、contact_idへの参加)、contact_communication(この連絡先に話したとき、contact_idに参加するたびに)、および学校のリストは、schools.school_id = contacts.contact_idに参加します)。3テーブル左外部結合はサブクエリでは機能しません

私が必要とするもの:私は個々の学校を探す必要があります。その学校には、そこに行く各人のリスト、主要な電話番号、私たちが持っていた最後の連絡(もしあれば)が必要です。

私たちがコミュニケーションをしていなければ、リストには表示されません。 「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:私が編集して、必要に応じて詳細情報をあげる)

EDIT 変化している答え(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 

答えて

2

してみてください。

​​3210
+0

はい!ありがとう、ysrb!私は自分のANDを "..."を括弧で囲み、OR文を書くことができるかどうかはわかりませんでした。ありがとうございました! – Charlie

+1

心配はいりません!あなたを助けてくれてうれしい! :) – ysrb

関連する問題