Mysql не может присоединиться к записям даты, что видно в предложении where - PullRequest
1 голос
/ 04 марта 2011

У меня есть запрос, который выглядит так:

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'.

Но вывод corect будет отображаться для первых двух строк. На выходные 2-27 и 2-20. Почему не зачитал?

Если я перемещу предложение date в предложение where, то получу правильные значения в приведенной выше таблице Используемый SQL-запрос связан здесь:

И это выводит правильные две строки:

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, который читает 1 строку с флагом 'N' (правильным будет 2 строки)
  2. тот же запрос с INNER JOIN + while, который читает 2 строки с флагом 'N' (правильный запрос, но использует INNER JOIN)

Я не понимаю, почему условие INNER JOIN + Where не отображается в LEFT JOIN, если они имеют одинаковую логику.

Что не так?

1 Ответ

2 голосов
/ 04 марта 2011

В вашем первом запросе вы используете 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, и записи, которые не совпадают, отфильтровываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...