mysql join日期记录失败,可见where子句

标签 mysql sql join

我有一个如下所示的查询:

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-272-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/

此处呈现的内容:

  1. 使用 LEFT JOIN 的查询,读取带有“N”标志的 1 行(正确的是 2 行)
  2. 与 INNER JOIN + While 相同的查询,读取带有“N”标志的 2 行(正确的查询,但它使用 INNER JOIN)

我不明白为什么 INNER JOIN + Where 条件,如果它们是相同的逻辑,则不会出现在 LEFT JOIN 中。

怎么了?

最佳答案

在您的第一个查询中,您使用的是 LEFT JOIN不过滤 sales对于日期,而不是输出 NULL b 中不匹配的记录值.

如您在输出中所见,b.idNULL对于除第一个记录之外的所有记录(似乎在 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/

相关文章:

php - mysql 拒绝网络连接

c# - EF : Potential runtime violation of table如何解决

PHP-MySQL | PHP-MySQL那么更好/更干净的方式吗?

mysql - 将 NOW() 设置为日期时间数据类型的默认值?

mysql连接问题

sql - 自然连接和内连接的区别

php - 将 groupBy() 与 orderBy() 和 limit() 一起使用

mysql - 将已更改列的差异值插入到具有匹配列的表中的最有效方法?

在 sequelize 中连接表

mysql - 使用 mysql 和 like 语句将完整单词与查询匹配