我有一个如下所示的查询:
SELECT SUM(`georder`) AS `order`,
SUM(quantity) AS quantity,
SUM(onhandqty) AS onhandqty,
SUM(carryover) AS carryover,
SUM(knownloss) AS knownloss,
SUM(selloff1) AS selloff1,
weekno,
YEAR(ardate8n) AS `year`,
Concat(GROUP_CONCAT(DISTINCT IF(flag1<>'N', flag1, '') ORDER BY IF(flag1
<>'N',
flag1,
'') ASC
SEPARATOR ''), IF(flag1<>'N'
AND b.id IS NOT NULL, 'N', '')) AS flag1,
Date_format(Str_to_date(Concat(Yearweek(ardate8n) + 1, ' Sunday'),
'%X%V %W'),
'%c-%e') AS endoftheweek,
b.id
FROM sales s
/*
section starts here
*/
LEFT JOIN blog b
ON s.custno = b.custno
AND s.prodno = b.prodno
AND ( DATE(s.ardate8n)>=DATE(b.start_date)
AND DATE(s.ardate8n)<=DATE(b.end_date) )
/*
section ends here
*/
JOIN (SELECT DISTINCT `prodno`
FROM `familycode`
WHERE slsfamlycd = 101) f
ON f.prodno = s.prodno
WHERE s.custno = 25609
AND s.deptno = 0
AND ( DATE(ardate8n) BETWEEN '2010-11-28' AND '2011-02-26' )
GROUP BY Yearweek(ardate8n)
ORDER BY ardate8n DESC;
这个查询输出
45, 0, 146, 217, 0, 75, 09, 2011, 'N', '2-27', 46090 352, 406, 902, 551, 0, 333, 07, 2011, '', '2-20', 352, 364, 920, 642, 0, 302, 06, 2011, '', '2-13', 550, 477, 1830, 1465, 0, 688, 06, 2011, '', '2-6', 968, 846, 1590, 803, 0, 540, 05, 2011, '', '1-30', 368, 332, 1083, 808, 0, 294, 04, 2011, '', '1-23', 449, 444, 984, 568, 0, 395, 03, 2011, '', '1-16', 398, 441, 1090, 689, 0, 367, 02, 2011, 'H', '1-9', 337, 337, 861, 542, 0, 282, 52, 2010, 'H', '1-2', 254, 245, 1097, 875, 0, 325, 52, 2010, 'BH', '12-26', 394, 398, 1024, 677, 0, 316, 51, 2010, 'B', '12-19', 370, 395, 1066, 699, 0, 364, 50, 2010, '', '12-12', 399, 386, 882, 528, 0, 353, 49, 2010, 'H', '12-5',
如您所见,第一行有一个“N”记录。
但最正确的输出是显示前两行。对于周末 2-27
和 2-20
。为什么不读出来?
如果我将日期子句移动到 where 子句,我将在上表中获得正确的值。使用的 SQL 查询链接在这里:http://paste.pocoo.org/show/348085/
这会输出正确的两行:
37, 0, 86, 116, 0, 56, 08, 2011, 'N', '2-27', 46089 226, 275, 501, 239, 0, 194, 08, 2011, 'N', '2-20', 46090
此处给出表架构:http://paste.pocoo.org/show/348174/
此处呈现的内容:
- 使用 LEFT JOIN 的查询,读取带有“N”标志的 1 行(正确的是 2 行)
- 与 INNER JOIN + While 相同的查询,读取带有“N”标志的 2 行(正确的查询,但它使用 INNER JOIN)
我不明白为什么 INNER JOIN + Where 条件,如果它们是相同的逻辑,则不会出现在 LEFT JOIN 中。
怎么了?
最佳答案
在您的第一个查询中,您使用的是 LEFT JOIN
不过滤 sales
对于日期,而不是输出 NULL
b
中不匹配的记录值.
如您在输出中所见,b.id
是NULL
对于除第一个记录之外的所有记录(似乎在 b
中有匹配项)。
在您的第二个查询中,您移动了连接条件
( DATE(s.ardate8n)>=DATE(b.start_date)
AND DATE(s.ardate8n)<=DATE(b.end_date) )
进入WHERE
条款。
这变成了 LEFT JOIN
进入隐式 INNER JOIN
, 不匹配的记录被过滤掉。
关于mysql join日期记录失败,可见where子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5197111/