我有一个视图表,其中包含以下字段:
paymentID,jobID,jobNumber,jobType,countType,countID,salesRep,dealershipName,checkTS,paymentAmount,estimatedMailArrival
当checkTS介于特定日期范围之间时,我需要选择这些字段。 (checkTS是日期时间字段)。在这些字段的顶部,我需要从另一个名为jobtasks的表中选择两个时间戳(它们可能存在也可能不存在,因此我将使用左连接)。为此,我设置了以下查询:
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”没有被拉动。
如果我删除所有艺术和列表内容,我会得到正确数量的结果...... 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;
如果我使用左连接,为什么不会返回某些记录?
答案 0 :(得分: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;
答案 1 :(得分: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)
WHERE
ed表上的所有LEFT JOIN
条件仍会计算在内(如果未加入表格,这些列的值将为NULL
。)