Как сгруппировать 0 с NULL в mysql select

Я знаю, что существует много вариантов этого вопроса, но ни один из них, похоже, не решает мою проблему.

У меня есть страница со статистикой заказов на веб-сайте. Одной из переменных, которые он учитывает, является то, какой «веб-сайт» использовал клиент. Идентификаторы веб-сайтов представляют собой целые числа, но по историческим причинам один из них сохраняется как 0 или NULL. Мне нужно сгруппировать их вместе в моем запросе.

Я знаю, что могу обновить все записи NULL до 0 в этой строке базы данных, но необходимо внести много изменений, чтобы предотвратить добавление большего количества.

Мой первоначальный запрос был:

SELECT o.website, p.orderid, count(p.orderid) ordercount
FROM gdd_order as o, gdd_process as p 
WHERE o.orderid = p.orderid 
AND p.prog_return >= '2024-03-01' 
AND p.prog_return < '2024-03-31'  
GROUP BY o.website 
ORDER BY FIELD(o.website,0,5,1,2,3,4)

который возвращает

Веб-сайт номер заказа количество заказов (НУЛЕВОЙ) 92914 76 0 93256 48 5 92916 74 1 92908 136

Я пытался:

SELECT ifnull(o.website, 0) website, p.orderid, count(p.orderid) ordercount
FROM gdd_order as o, gdd_process as p 
WHERE o.orderid = p.orderid 
AND p.prog_return >= '2024-03-01' 
AND p.prog_return < '2024-03-31'  
GROUP BY o.website 
ORDER BY FIELD(o.website,0,5,1,2,3,4)

который делает NULL нулевым, но не группирует строку «null 0» со строкой «0»:

Веб-сайт номер заказа количество заказов 0 92914 76 0 93256 48 5 92916 74 1 92908 136

Как объединить данные «0» и «NULL 0» в одной строке?

Я не уверен, что имеет смысл говорить, что вы хотите группировать по веб-сайтам, а затем включать в результат идентификаторы заказов. Я думаю, это также приведет к принудительной группировке по идентификатору заказа.

topsail 17.05.2024 18:36
GROUP BY IFNULL(o.website, 0)
Barmar 17.05.2024 18:56

Если вы дадите псевдониму другое имя из столбца, вы можете использовать GROUP BY <alias>

Barmar 17.05.2024 18:57

Также используйте IFNULL() в столбце ORDER BY.

Barmar 17.05.2024 18:58

Включение p.orderid в список выбора делает ваш запрос недетерминированным. При правильной настройке (с включенной функцией ONLY_FULL_GROUP_BY ) вы должны получить сообщение об ошибке. Пожалуйста, прочитайте Обработка GROUP BY в MySQL.

user1191247 17.05.2024 20:01
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
5
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте функцию COALESCE(), которая возвращает первое ненулевое значение в списке.

https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_coalesce

Обновите свой запрос, например:

SELECT o.website, p.orderid, count(p.orderid) ordercount
FROM (SELECT COALESCE(website, 0), [OTHER COLUMS] FROM gdd_order) o, gdd_process as p 
WHERE o.orderid = p.orderid 
AND p.prog_return >= '2024-03-01' 
AND p.prog_return < '2024-03-31'  
GROUP BY o.website 
ORDER BY FIELD(o.website,0,5,1,2,3,4)

Это должно работать



SELECT COALESCE(website, 0), [OTHER COLUMS] FROM gdd_order;

Этот запрос изменит вашу таблицу с

Веб-сайт номер заказа количество заказов (НУЛЕВОЙ) 92914 76 0 93256 48 5 92916 74 1 92908 136

к

Веб-сайт номер заказа количество заказов 0 92914 76 0 93256 48 5 92916 74 1 92908 136

Спасибо

Они уже используют IFNULL(), что аналогично COALESCE(), когда имеется только 2 аргумента.

Barmar 17.05.2024 19:00

Вам необходимо назначить псевдоним в подзапросе.

Barmar 17.05.2024 19:02

Да, ты прав @Barmar. Ваш подход лучше всего...

Art Bindu 17.05.2024 19:04
Ответ принят как подходящий

Постоянно используйте IFNULL(o.website, 0) на протяжении всего запроса.

SELECT ifnull(o.website, 0) website, p.orderid, count(p.orderid) ordercount
FROM gdd_order as o, gdd_process as p 
WHERE o.orderid = p.orderid 
AND p.prog_return >= '2024-03-01' 
AND p.prog_return < '2024-03-31'  
GROUP BY IFNULL(o.website, 0)
ORDER BY FIELD(IFNULL(o.website, 0),0,5,1,2,3,4)

друг. Я думаю, вы можете добавить эту часть, чтобы объединить 0 и NULL.

IFNULL(o.website, 0)

Итак, ваш запрос:

SELECT IFNULL(o.website, 0) AS website, p.orderid, COUNT(p.orderid) AS ordercount
FROM gdd_order AS o
JOIN gdd_process AS p ON o.orderid = p.orderid
WHERE p.prog_return >= '2024-03-01' AND p.prog_return < '2024-03-31'  
GROUP BY IFNULL(o.website, 0)
ORDER BY FIELD(IFNULL(o.website, 0), 0, 5, 1, 2, 3, 4);

Сообщите, работает ли это с вашей базой данных, у нас нет выборочной информации, подтверждающей это.

Другие вопросы по теме