Я знаю, что существует много вариантов этого вопроса, но ни один из них, похоже, не решает мою проблему.
У меня есть страница со статистикой заказов на веб-сайте. Одной из переменных, которые он учитывает, является то, какой «веб-сайт» использовал клиент. Идентификаторы веб-сайтов представляют собой целые числа, но по историческим причинам один из них сохраняется как 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)
который возвращает
Я пытался:
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» и «NULL 0» в одной строке?
GROUP BY IFNULL(o.website, 0)Если вы дадите псевдониму другое имя из столбца, вы можете использовать GROUP BY <alias>
Также используйте IFNULL() в столбце ORDER BY.
Включение p.orderid в список выбора делает ваш запрос недетерминированным. При правильной настройке (с включенной функцией ONLY_FULL_GROUP_BY ) вы должны получить сообщение об ошибке. Пожалуйста, прочитайте Обработка GROUP BY в MySQL.






Используйте функцию 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;
Этот запрос изменит вашу таблицу с
к
Спасибо
Они уже используют IFNULL(), что аналогично COALESCE(), когда имеется только 2 аргумента.
Вам необходимо назначить псевдоним в подзапросе.
Да, ты прав @Barmar. Ваш подход лучше всего...
Постоянно используйте 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);
Сообщите, работает ли это с вашей базой данных, у нас нет выборочной информации, подтверждающей это.
Я не уверен, что имеет смысл говорить, что вы хотите группировать по веб-сайтам, а затем включать в результат идентификаторы заказов. Я думаю, это также приведет к принудительной группировке по идентификатору заказа.