1

我有一个视图表,其中包含以下字段:

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

当 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;

如果我使用左连接,为什么不会返回一些记录?

4

2 回答 2

1

使用 a时,将这些表中的字段添加到您的条件LEFT JOIN对您没有任何好处- 与此时的 a 相同。 WHEREINNER JOIN

I like to move those types of WHERE criteria to the JOIN itself:

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)

ed 表上的任何WHERE条件LEFT JOIN仍然计算在内(NULL如果表未连接,这些列的值将是)。

于 2013-03-30T23:06:21.147 回答