cómo establecer MYSQL CONCAT MAX LENGTH

He seleccionado concat en mi procedimiento de tienda como este

SET @resultQuery = CONCAT("
SELECT
    @no := @no + 1 AS no,
    uniqueCode,
    orderNumber,
    orderDate,
    orderTime,
    salesName,
    buyerCategory,
    discountCode,
    buyerName,
    email,
    mobile,
    module,
    module_id,
    productsNumber,
    purchaseValue,
    postalFee,
    discount,
    premium,
    uniqueCode2,
    total,
    ", @productsSelect, "
FROM
    (SELECT 
            @uniqueCode := IFNULL(om.id, 0) AS uniqueCode,
            @orderNumber := IFNULL(om.code_order, '') AS orderNumber,
            IFNULL(DATE_FORMAT(om.createdAt, '%e/%c/%Y'), '') AS orderDate,
            IFNULL(DATE_FORMAT(om.createdAt, '%H:%i'), '') AS orderTime,
            IFNULL(sls.fullname, '') AS salesName,
            IFNULL((CASE
                            WHEN EXISTS (SELECT
                                                ob.buyer_id
                                            FROM
                                                order_match om2
                                                    LEFT JOIN
                                                order_buyer ob2 ON om2.order_buyer_id = ob2.id
                                            WHERE
                                                om2.createdAt < ?
                                                    AND om2.order_status_id IN (4, 5, 6, 8)
                                                    AND ob.buyer_id = ob2.buyer_id
                                            GROUP BY ob2.buyer_id)
                                THEN 'Ulang'
                            ELSE 'Baru'
                        END), '') AS buyerCategory,
            IFNULL(odis.discount_code, '') AS discountCode,
            IFNULL(usr.fullname, '') AS buyerName,
            IFNULL(usr.email, '') AS email,
            IFNULL(usr.mobile, '') AS mobile,
            mdl.name AS module,
            mdl.id AS module_id,
            @i AS productsNumber,
            ", @products, "
            @purchaseValue := IFNULL(om.total_price, 0) AS purchaseValue,
            @postalFee := IFNULL(od.price, 0) AS postalFee,
            @discount := IFNULL((SELECT
                                    CASE
                                        WHEN EXISTS (SELECT 
                                                            rdh.debit
                                                        FROM 
                                                            referral_deposit_histories rdh
                                                        WHERE
                                                            rdh.order_match_id = om2.id
                                                                AND
                                                            rdh.debit > 0)
                                            THEN (SELECT 
                                                        rdh.debit
                                                    FROM 
                                                        referral_deposit_histories rdh
                                                    WHERE
                                                        rdh.order_match_id = om2.id
                                                            AND
                                                        rdh.debit > 0)
                                        ELSE (SELECT
                                                    odis2.discount_amount
                                                FROM
                                                    order_discount odis2
                                                WHERE
                                                    odis2.order_match_id = om2.id)
                                    END
                                FROM
                                    order_match om2
                                WHERE
                                    om2.id = om.id), 0) AS discount,
            @premium := IFNULL(op.price, 0) AS premium,
            @uniqueCode2 := IFNULL(CASE
                                        WHEN om.createdAt > '2017-08-02 23:59:59'
                                            THEN pmh.price
                                        ELSE @uniqueCode
                                    END, 0) AS uniqueCode2,
            @total := IFNULL(@purchaseValue + @postalFee - @discount + @premium + @uniqueCode2, 0) AS total
        FROM
            order_match om
                LEFT JOIN
            order_discount odis ON om.id = odis.order_match_id
                LEFT JOIN
            discount_sales ds ON odis.discount_code = ds.discount_code
                LEFT JOIN
            sales sls ON ds.sales_id = sls.id
                LEFT JOIN
            order_buyer ob ON om.order_buyer_id = ob.id
                LEFT JOIN
            users usr ON ob.buyer_id = usr.id
                LEFT JOIN
            order_delivery od ON om.id = od.order_match_id
                LEFT JOIN
            order_premium op ON om.id = op.order_match_id
                LEFT JOIN
            payment_method_history pmh ON om.id = pmh.order_match_id
                LEFT JOIN
            modules mdl ON om.module_id = mdl.id
        WHERE
            om.createdAt >= ?
                AND om.createdAt <= ?
                AND om.order_status_id IN (4, 5, 6, 8)
        ORDER BY om.createdAt DESC) paidOrdersTable");

PREPARE stmt FROM @resultQuery;
SET @paramDateFrom = paramDateFrom;
SET @paramDateTo = paramDateTo;
EXECUTE stmt USING @paramDateFrom, @paramDateFrom, @paramDateTo;
DEALLOCATE PREPARE stmt;

y regresa Error Code: 1117. Too many columns

cómo fijar la longitud máxima para concat, lo que aprendo en otra plataforma, su conjunto grupo_concat_max_len, pero ya que no es grupo concat (porque es concat no group_concat), ¿qué debo tomar para resolver este problema? Necesito un código como set group_concat_max_len pero para concat no group_concat

Pregunta hecha hace 3 años, 4 meses, 29 días - Por codemaster89


2 Respuestas:

  • El error que estás recibiendo es porque estás intentando concatenar demasiadas columnas en MySQL y has alcanzado el límite permitido para el número de columnas en una consulta.

    Para resolver este problema, una posible solución sería separar tu consulta en partes más pequeñas y luego combinar los resultados manualmente. Por ejemplo, podrías dividir tu consulta en dos partes y luego combinar los resultados en una tabla temporal.

    Aquí te dejo un ejemplo simplificado de cómo podrías hacerlo:

    sql
    
    • - Primera parte de la consulta
    CREATE TEMPORARY TABLE tempTable1 AS SELECT @no := @no + 1 AS no, uniqueCode, orderNumber, ... postalFee FROM (
    • - Coloca aquí la primera parte de tu consulta original
    ) AS part1;
    • - Segunda parte de la consulta
    CREATE TEMPORARY TABLE tempTable2 AS SELECT @no := @no + 1 AS no, premium, uniqueCode2, total FROM (
    • - Coloca aquí la segunda parte de tu consulta original
    ) AS part2;
    • - Combinar los resultados
    SELECT * FROM tempTable1 JOIN tempTable2 ON tempTable1.no = tempTable2.no;
    • - Limpieza de tablas temporales
    DROP TABLE tempTable1; DROP TABLE tempTable2;

    En este ejemplo, dividimos tu consulta original en dos partes y guardamos los resultados en tablas temporales, luego combinamos los resultados en una consulta final. Recuerda ajustar el código según la estructura y necesidades de tu consulta original.

    Espero que esta sugerencia te ayude a resolver el problema de concatenación de columnas en tu consulta MySQL. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 18, 2020 a las 02:50 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Puedes establecer la longitud máxima para CONCAT utilizando la variable de sesión max_allowed_packet. Esta variable controla el tamaño máximo de los paquetes que MySQL puede enviar y recibir.

    Para establecer la longitud máxima de CONCAT, ejecuta el siguiente comando:

    sql
    SET max_allowed_packet = ;
    

    Sustituye <longitud_máxima_en_bytes> por el tamaño máximo en bytes que deseas permitir para los resultados de CONCAT.

    Una vez que hayas establecido la variable max_allowed_packet, MySQL truncará automáticamente los resultados de CONCAT que superen la longitud máxima especificada.

    Ejemplo:

    Para establecer la longitud máxima de CONCAT en 10 MB, ejecuta el siguiente comando:

    sql
    SET max_allowed_packet = 10000000;
    

    Nota:

    El valor predeterminado de max_allowed_packet es de 4 MB. El valor máximo posible para max_allowed_packet es de 1 GB.

    • Si estableces `max_allowed_packet` en un valor demasiado bajo, podrías experimentar errores de truncamiento en los resultados de CONCAT.

    Una vez que hayas establecido la longitud máxima para CONCAT, vuelve a ejecutar tu procedimiento almacenado y comprueba si se resuelve el error Too many columns.

    Respondida el Dec 18, 2020 a las 03:00 - por Gemini

    Votos positivos: 0 | Votos negativos: 0