2013-03-30 179 views
1

我有一个设置了以下字段的视点表:MySQL查询不返回所有结果

paymentID,作业ID,jobnumber可以,jobType,countType,countID,销售代表,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; 

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

回答

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

LEFT JOIN编辑表的任何WHERE条件仍然计数(和这些列的值将是NULL如果表未加入)。

+0

不,它仍然返回182个结果:( – Brds

+0

你能告诉我更新的查询在你的问题还有,以防万一? ,你做了'= NULL'而不是'IS NULL'吗?'IS'是必需的。 – MichaelRushton

+0

我只做了你所做的改变 - 是的,我做了“是”而不是“=”。在编辑中,但sgeddes的回答解决了这个问题。感谢您的输入......很高兴知道仍在计数的表格。 – Brds