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