MySQL ВЫБИРАЕТ все, сгруппированные с помощью LEFT JOIN и WHERE

#mysql #left-join #where-clause

#MySQL #левое соединение #where-предложение

Вопрос:

Текущий результат:

 SELECT CT.cat2 as Cat, SUM(MT.`revenue`) as Revenue
                FROM sales MT
                    LEFT JOIN `2016productcodes` CT 
                        ON MT.productsku = CT.productcode 
                WHERE MT.`date` BETWEEN '2016-10-01' AND '2016-10-13' AND revenue > 0
                GROUP BY CT.cat2

Cat        | Revenue   |
---------------------------
cat1       | 250.00    |
cat3       | 100.00    |
cat5       | 32.00     | 
 

Я хочу показать ВСЕ сгруппированные категории, хотя (для отображения NULL, BLANK или «0.00», когда нет дохода .. не имеет значения).

Желаемый результат:

 Cat        | Revenue   |
---------------------------
cat1       | 250.00    |
cat2       |           |
cat3       | 100.00    | 
cat4       |           |
cat5       | 32.00     | 
 

Я пробовал этот запрос, и он действительно показывает все категории, но группирует весь доход в каждой категории (доход всегда одинаков).

 SELECT cat2 as Cat, (SELECT
        SUM(MT.`revenue`)
                FROM 2016productcodes CT 
                    LEFT JOIN `sales` MT
                        ON MT.productsku = CT.productcode

                WHERE MT.`date` BETWEEN '2016-10-01' AND '2016-10-13'

           ) Revenue
FROM 2016productcodes
GROUP BY cat2
 

Комментарии:

1. Вы пробовали просто изменить порядок соединения? (т.е. `2016productcodes` CT LEFT JOIN sales MT ... ) …. и вы захотите переместить текущие критерии WHERE в критерии объединения.

2. Не повезло, когда я отменяю JOIN, типичные те же результаты.

3. Если вы не переместите WHERE критерий в JOIN критерии, запрос будет действовать как INNER JOIN (поскольку результаты для «cats» без продаж будут иметь MT значения NULL, которые будут отфильтровываться WHERE .)

4. Бинго, действительно, это сработало. Пришлось проиндексировать несколько полей, но теперь все работает отлично, спасибо!