MySQL Неожиданное поведение «НЕ ВХОДИТ», когда LEFT JOIN WITH null результаты - PullRequest
0 голосов
/ 13 июля 2020

У меня есть приложение, которое получает объект и генерирует динамический c запрос для сбора данных отчетов. Этот объект содержит свойства фильтра, которые в конечном итоге переводятся в операторы «WHERE» в MySQL. Более простая и актуальная c версия сгенерированного запроса выглядит примерно так:

 SELECT cr3.id AS col_1, 
 count(table1.ids) AS col_2 
 FROM table1 
 LEFT JOIN table2 cr3 ON table1.id = cr3.Id
 WHERE cr3.id NOT IN ('val') GROUP BY 1;

Запрошенная БД имеет этот набор данных (без применения какой-либо фильтрации):

| col_1 | col_2 |
| null  | 100   |
| val   | 100   |

Когда это выполняется, набор результатов пуст . Ожидалось, что я получу первую строку набора данных:

| null | 100 |

Если я откорректирую предложение WHERE из

WHERE cr3.id NOT IN ('val') => WHERE (cr3.id NOT IN ('val') OR cr3.id IS NULL)

, я получаю ожидаемые результаты, но они динамически генерируются для разных типы запросов, и я не могу найти способ настроить оператор «NOT IN», чтобы он работал правильно и возвращал все, что не соответствует тому, что указано в качестве аргумента.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете отфильтровать table2 перед тем, как присоединиться:

SELECT t2.id AS col_1, COUNT(t1.id) AS col_2 
FROM table1 t1 
LEFT JOIN (SELECT * FROM table2 WHERE id NOT IN ('val')) AS t2 
ON t2.id = t1.id
GROUP BY t2.id;
0 голосов
/ 13 июля 2020

Я видел, что есть много вариантов получения желаемого результата, но решение, которое я искал, можно было легко применить в этой динамической c среде и не изменять операторы, следующие за фильтрацией WHERE, в данном случае лучшее решение, которое я нашел, заключалось в улучшении фильтрующей части с помощью вызова функции COALESCE, например:

 SELECT cr3.id AS col_1, 
 count(table1.ids) AS col_2 
 FROM table1 
 LEFT JOIN table2 cr3 ON table1.id = cr3.Id
 WHERE COALESCE(cr3.id, '') NOT IN ('val') GROUP BY 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...