2011-11-08 7 views
1

これまでに回答があった場合はごめんなさい。私は少しこの問題を記述するのに最善の方法はそれを心配することは絶対に不明です。しかし、ここに行く...MySQLのサブクエリAND 'NOT IN'

基本的に私は 'id'と 'タイトル'を保持する 'プロジェクト'テーブルを持っています。私はまた、プロジェクトがアーカイブ(ブール値)に設定されているときに情報を保持する 'projects_history'テーブルを持っています。それはプロジェクトを参照する 'pid'キーを持っています。更新されるごとに、各プロジェクトごとに複数のレコードが存在することがあります(誰が値を設定するかを追跡するため)。

また、プロジェクトのために提起された問い合わせに関する情報を保持する 'project_enquiries'テーブルがあります。したがって、 'プロジェクト'を参照する 'pid'キーがあります。同様に、inquiryがclosed(ブール値)に設定されているとき(IF)を記録する 'project_enquiry_history'テーブルがあります。これには、project_enquiryを参照する 'eid'キーがあります。更新されるごとに、各照会ごとに複数のレコードが存在することがあります(誰が値を設定するかを追跡するため)。

私のクエリはアーカイブされていないプロジェクトを引き出すことを目的としています(プロジェクト '履歴'にレコードがないか、プロジェクトの最新レコードに 'アーカイブ済み' = 0があります)。まだ開いています(したがって、 'project_enquiry_history'にレコードが存在しないか、または問い合わせの最新レコードに 'open' = 1があります)。

私は本当にどこからクエリを開始するのが苦労しています。

答えて

0

最初の事は何もレコードがproject_historyに存在しない場合、その後、あなたがこれを発見するために、プロジェクトIDを使用してproject_historyテーブルの上にあなたのprojectsテーブルのleft joinを行う必要がありますということです。結果に、project_historyの列にヌルであるエントリがあります。ここには対応するエントリがありません。そのプロセスを連鎖させ、その結果を使用して 'project_enquiry_history'の別の左結合を実行して、エントリのないアイテムを見つけることができます。

これらの結果を通常通り使用して、データの選択を行うこともできます。あなたはタイムスタンプと、そのようなを使用している場合は、最新のを見つけるために、これを微調整する必要があり

SELECT * from project p LEFT OUTER JOIN project_history ph ON P.ID=ph.pid LEFT OUTER JOIN project_enquiry_history peh ON peh.ID=ph.pid WHERE (archived is NULL OR archived=0) AND (open is NULL OR open=1)

それは次のようになります。

+0

ありがとうPoodlehat。それは多くの助けになりましたが、最新のものを見つける方法がわかりません。私はフィールドとして 'created'の下に日付を記録するためにINTとして保存されたunixタイムスタンプを使用しています。 – PeeBee

+0

おそらくMAX上にMAXを置くことができます.32ビットのUNIXタイムスタンプは2038年までロールオーバーされません。上記のLEFT OUTER JOIN project_history phを実行する代わりに、LEFT OUTER JOIN(SELECT ph.pid、MAX(ph.created)FROM project_history ph、project p WHERE P.ID = ph.pid GROUP BY pid)を実行します。 ON p.id = x.pid' – Poodlehat

+0

これまでの返信をお待ちして申し訳ありません。私はちょうどあなたが示唆したことを試しましたが、現在、アーカイブされた列が存在しないというエラーが発生しています。私のクエリはそのままです 'SELECT DISTINCT p.id FROM projects p L1EFT OUTER JOIN(SELECT ph.pid、MAX(ph.created)FROM project_history ph、projects p WHERE P.ID = ph.pid GROUP BY pid)x ON p.id = x.pid LEFT OUTER JOIN project_enquiries pe ON P.ID = pe.pid LEFT OUTER JOIN project_enquiry_history peh ON peh.eid = pe。ID [OK]を、これは私がこれまでのところ、 'プロジェクトPからDISTINCT p.id を選択したものである( がアーカイブ NULL OR = 0 アーカイブされている) AND( OPENが NULL OR OPEN = 1 IS)' – PeeBee

関連する問題