MySQL 5.1 на 5.7 изменить Порядок По больше не работает - PullRequest
2 голосов
/ 13 июля 2020

У меня проблема с MySQL созданием переменной счетчика SOrder на основе установленного порядка, определенного порядком по. Он работал в MySQL 5.1, но в настоящее время не работает в 5.7. Исходный запрос в версии 5.1 имел порядок подзапросов и был приемлемым для стандартов того времени. В версии 5.7 с отключенным режимом only_full_group_by я добавил порядок по внешнему, но даже когда порядок внутри подзапроса был закомментирован (или проигнорирован в соответствии со стандартами SQL), он выводит SOrder, как если бы он был случайным, но не на основе столбца Carrier, PRIOR, ShipMethod, SingleModel.

SELECT 
    Carrier,
    PRIOR,
    ShipMethod,
    GroupOrder,
    @row_no:=IF(@prev_val = ANY_VALUE(t.SingleModel),
        @row_no,
        @row_no + 1) AS 'SOrder',
    SingleModel,
    COUNT(t.SingleModel) AS 'SingleModelTotQty',
    @prev_val:=ANY_VALUE(t.SingleModel)
FROM
    (SELECT 
        CASE
            WHEN ANY_VALUE(W.hdr_user_defined_field18) LIKE '%Fedex%' THEN 'FEDEX'
            ELSE 'UPS'
        END AS 'Carrier',
        CASE
            WHEN
                ANY_VALUE(W.hdr_user_defined_field20) IN ('16' , '26', '45', '88', '96')
                        OR ANY_VALUE(W.hdr_user_defined_field20) IN ('19' , '21', '22', '23', '24', '44', '76', '77', '78')
            THEN 'PRIOR'
            ELSE 'NORM'
        END AS 'PRIOR',
        CASE
            WHEN
                ANY_VALUE(W.hdr_user_defined_field20) IN ('88' , '96', '80', '97')
                    OR ANY_VALUE(W.hdr_user_defined_field20) IN ('76' , '77', '78', '79')
                    OR ANY_VALUE(W.`Ship-To Location`) != ''
            THEN 'S2S'
            ELSE 'S2H'
        END AS 'ShipMethod',
        CASE
            WHEN SUM(Quantity) = 1 THEN 'Single'
            WHEN
                SUM(Quantity) > 1 AND COUNT(`PO Number`) = 1
            THEN 'Multiple'
            WHEN COUNT(`PO Number`) > 1 THEN 'Mixed'
        END AS 'GroupOrder',
        CASE
            WHEN SUM(Quantity) = 1 THEN `Supplier Item Nbr`
            WHEN SUM(Quantity) > 1
                    AND COUNT(`PO Number`) = 1
            THEN ' '
            WHEN COUNT(`PO Number`) > 1 THEN ' '
        END AS 'SingleModel',
        `PO Number` AS 'PONUM',
        CASE
            WHEN SUM(Quantity) = 1 THEN ' '
            ELSE SUM(Quantity)
        END AS 'QtyPerMulPO'
    FROM
        dropship.Walmart_FullPOs W
    WHERE
        ProcessedDate = CURDATE() - 5
    GROUP BY `PO Number`
    **ORDER BY Carrier , PRIOR DESC , ShipMethod , GroupOrder DESC , SingleModel DESC**
    ) t,
    (SELECT @row_no:=0) x,
    (SELECT @prev_val:='') y
WHERE
    GroupOrder = 'Single'
GROUP BY Carrier , PRIOR , ShipMethod , SingleModel
ORDER BY t.Carrier , t.PRIOR DESC , t.ShipMethod , t.GroupOrder DESC , t.SingleModel DESC

Результат Результат

1 Ответ

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

Проблема с вашим sql_mode.

Начиная с MySQL 5.7.x, режим sql по умолчанию включает ONLY_FULL_GROUP_BY . (До 5.7.5 MySQL не обнаруживал функциональную зависимость, и ONLY_FULL_GROUP_BY не включен по умолчанию).

ONLY_FULL_GROUP_BY : недетерминированные c запросы группировки будут отклонены

Дополнительные сведения см. В документации sql_mode

Метод 1:

Проверьте значение sql_mode по умолчанию:

SELECT @@sql_mode

Удалите ONLY_FULL_GROUP_BY из консоли, выполнив запрос ниже:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Метод 2:

Доступ к phpmyadmin для редактирования sql_mode

  • Войдите в phpmyadmin и откройте localhost
  • Вверху Переменные присутствуют в верхней части пунктов меню и найдите sql режим
  • Нажмите кнопку редактирования, чтобы удалить ONLY_FULL_GROUP_BY и сохранить sql настройки режима в phpmyadmin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...