7

金曜日の午後*で、私の脳は機能を停止しています。通常、このような愚かな SQL の質問に答えるのは私です。

後者を前者にLEFT JOINすることにより、別のテーブルの列の最大値とともに、1つのテーブルを取得しようとしています。

SELECT
  jobs.*,
  MAX(notes.`timestamp`) AS complete_date
FROM jobs
LEFT JOIN notes ON (jobs.id=notes.job_id)
WHERE (jobs.status="complete" OR jobs.status="closed")
  AND (notes.type="complete" OR notes.type IS NULL)
GROUP BY jobs.id
ORDER BY complete_date ASC

… の基準を満たすすべてのジョブを取得しようとしています。ジョブがある場合は、そのジョブに関連付けられている最新のメモのタイムスタンプ:WHERE jobs.type=complete

Job ID     Complete Date
1          today
2          NULL
4          yesterday

ジョブ 3 は基準を満たしていないため表示されませんjobs.status。しかし、私が実際に得るものは次のとおりです。

Job ID     Complete Date
1          today
4          yesterday

ジョブ 2 がありません。つまり、JOIN が INNER JOIN のように機能しています。
脳死の瞬間を迎えているのは私だけだと確信していますが、メモの値に関係なく、LEFT (OUTER) JOIN がすべての仕事を与えてくれない理由がわかりません。

具体的には、ユーザーはメモを削除できるため、完了/クローズされたジョブにはメモがない可能性がありますtype=complete(ステータスが変更されたときにメモが入力されます)。ユーザーがジョブを閉じてメモを追加するケースをキャッチしようとしています。 、次にメモを削除します。

*東のどこか

4

1 に答える 1

16

のように機能する句にnotesテーブルのフィルターがあるため、それを条件に移動します。WHEREJOININNER JOINJOIN

SELECT
  jobs.*,
  MAX(notes.`timestamp`) AS complete_date
FROM jobs
LEFT JOIN notes 
  ON (jobs.id=notes.job_id)
  AND (notes.type="complete" OR notes.type IS NULL)
WHERE (jobs.status="complete" OR jobs.status="closed")
GROUP BY jobs.id
ORDER BY complete_date ASC;

これはサブクエリを使用して行うこともできるため、サブクエリ内でメモ フィルターを適用します。

SELECT
  jobs.*,
  n.complete_date
FROM jobs
LEFT JOIN
(
    select job_id, MAX(`timestamp`) AS complete_date
    from notes 
    where (type="complete" OR type IS NULL)
    group by job_id
) n
  ON (jobs.id=n.job_id)
WHERE (jobs.status="complete" OR jobs.status="closed")
ORDER BY complete_date ASC
于 2013-08-08T15:16:11.517 に答える