1

次のフィールドで設定されたビュー テーブルがあります。

paymentID、jobID、jobNumber、jobType、countType、countID、salesRep、dealershipName、checkTS、paymentAmount、estimatedMailArrival

checkTS が特定の日付範囲内にある場合、これらのフィールドを選択する必要があります。(checkTS は日時フィールドです)。これらのフィールドに加えて、jobtasks という名前の別のテーブルから 2 つのタイムスタンプを選択する必要があります (存在する場合と存在しない場合があるため、左結合を使用します)。これを行うために、次のクエリを設定しました。

SELECT 
    s.jobID, s.jobNumber, s.jobType, s.countType, s.countID, s.salesRep,           s.dealershipName, s.checkTS, s.paymentID, s.paymentAmount, s.estimatedMailArrival, 
    jt1.completedTimestamp as Art, 
    jt2.completedTimestamp as List
FROM salesboard s
LEFT JOIN jobtasks jt1 ON s.jobID = jt1.jobID
LEFT JOIN jobtasks jt2 ON s.jobID = jt2.jobID
WHERE
    s.checkTS BETWEEN '2013-03-01 00:00:00' AND '2013-03-31 23:59:59' AND
    jt1.taskID = 22 AND
    jt2.taskID = 23
ORDER BY s.checkTS DESC;

クエリはエラーを返しませんが、すべてのレコードをプルしていないことがわかりました (プルする必要がある 242 のうち 182 をプルしています)。手動でデータベース (mysql) にアクセスして、プルする必要があるレコードを表示できますが、そうではありません。一例 - 「2013-03-04 10:11:00」のタイムスタンプは取得されていません。

Art と List のものをすべて削除すると、正しい数の結果が得られます... 242.

SELECT 
    s.jobID, s.jobNumber, s.jobType, s.countType, s.countID, s.salesRep, s.dealershipName, s.checkTS, s.paymentID, s.paymentAmount, s.estimatedMailArrival
FROM salesboard s
WHERE
    s.checkTS BETWEEN '2013-03-01 00:00:00' AND '2013-03-31 23:59:59'
ORDER BY s.checkTS DESC;

左結合を使用している場合、一部のレコードが返されないのはなぜですか?

4

2 に答える 2

1

を使用する場合LEFT JOIN、それらのテーブルのフィールドを条件に追加しても意味がありません。その時点で WHEREの と同じです。INNER JOIN

WHEREこれらのタイプの基準をそれ自体に移動するのが好きJOINです:

SELECT 
    s.jobID, s.jobNumber, s.jobType, s.countType, s.countID, s.salesRep,           s.dealershipName, s.checkTS, s.paymentID, s.paymentAmount, s.estimatedMailArrival, 
    jt1.completedTimestamp as Art, 
    jt2.completedTimestamp as List
FROM salesboard s
LEFT JOIN jobtasks jt1 ON s.jobID = jt1.jobID 
    AND jt1.taskID = 22
LEFT JOIN jobtasks jt2 ON s.jobID = jt2.jobID
    AND jt2.taskID = 23
WHERE
    s.checkTS BETWEEN '2013-03-01 00:00:00' AND '2013-03-31 23:59:59' AND
ORDER BY s.checkTS DESC;
于 2013-03-30T23:09:24.563 に答える
0

への変更:

WHERE
    s.checkTS BETWEEN '2013-03-01 00:00:00' AND '2013-03-31 23:59:59' AND
    (jt1.taskID = 22 OR jt1.taskID IS NULL) AND
    (jt2.taskID = 23 OR jt2.tastID IS NULL)

WHEREed テーブルの条件LEFT JOINは引き続きカウントされます (これらの列の値は、テーブルが結合されNULLていない場合になります)。

于 2013-03-30T23:06:21.147 に答える