これまでに回答があった場合はごめんなさい。私は少しこの問題を記述するのに最善の方法はそれを心配することは絶対に不明です。しかし、ここに行く...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があります)。
私は本当にどこからクエリを開始するのが苦労しています。
ありがとうPoodlehat。それは多くの助けになりましたが、最新のものを見つける方法がわかりません。私はフィールドとして 'created'の下に日付を記録するためにINTとして保存されたunixタイムスタンプを使用しています。 – PeeBee
おそらく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
これまでの返信をお待ちして申し訳ありません。私はちょうどあなたが示唆したことを試しましたが、現在、アーカイブされた列が存在しないというエラーが発生しています。私のクエリはそのままです '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