首页 > 解决方案 > #1054 - 从 Mysql 导出到 MariaDB 后 order 子句中的未知列

问题描述

在我将数据库从一个使用 MySql 5.7.23-cll-lve 的主机导出到另一台使用 MariaDB 10.2.27-MariaDB-cll-lve 的主机后,我收到了 #1054 -unknown column in order 子句错误。我现在两个主机都在工作,所以我可以看到查询在第一个和 MariaDB 中工作,会抛出这个错误。我检查了该列是否存在,结构是相同的。我也尝试使用“MYSQL40”导出,但没有任何改变。

我能做些什么?

我将提出问题的查询(不是唯一的,但其他类似):

SELECT * FROM (
    (SELECT result.*, IFNULL(SUM(mv.monto_pago_fv), 0) AS pago  FROM(
        (SELECT DISTINCT f.id_factura_de_venta, f.numero_factura_de_venta, f.fecha_contable_fv, f.fecha_fv, f.anular_fv, 
            f.id_cliente, f.tipo,
            c.rut, c.nombre, SUM(fot.monto_pago_ot) AS monto_facturado_neto, SUM(ROUND(fot.monto_pago_ot*0.19)) AS iva
        FROM facturas_de_ventas f
        JOIN clientes_y_proveedores c ON f.id_cliente=c.id_cliente_o_proveedor
        JOIN facturas_de_ot fot ON f.id_factura_de_venta=fot.id_factura_de_venta
        GROUP BY f.id_factura_de_venta
        ORDER BY f.id_factura_de_venta DESC)
        UNION
        (SELECT id_factura_de_venta, numero_factura_de_venta, fecha_contable_fv, fecha_fv, anular_fv,
                id_cliente, tipo, rut, nombre, SUM(monto_facturado_neto) AS monto_facturado_neto, SUM(iva) as iva  FROM(
            (SELECT DISTINCT f.*, c.rut, c.nombre, SUM(s.valor_sf*s.cantidad_sf) AS monto_facturado_neto, 
            SUM(ROUND(s.valor_sf*s.cantidad_sf*0.19)) as iva
            FROM facturas_de_ventas f
            JOIN clientes_y_proveedores c ON f.id_cliente=c.id_cliente_o_proveedor
            JOIN servicios_factura s ON f.id_factura_de_venta=s.id_factura_de_venta
            GROUP BY f.id_factura_de_venta)
            UNION
            (SELECT DISTINCT f.*, c.rut, c.nombre, SUM(mf.valor_mf*mf.cantidad_mf) AS monto_facturado_neto, SUM(IF(m.iva_material=1, mf.valor_mf*mf.cantidad_mf*0.19, 0)) AS iva
            FROM facturas_de_ventas f
            JOIN clientes_y_proveedores c ON f.id_cliente=c.id_cliente_o_proveedor
            JOIN materiales_factura mf ON f.id_factura_de_venta=mf.id_factura_de_venta
            JOIN materiales m ON mf.id_material=m.id_material
            GROUP BY f.id_factura_de_venta)
            ) AS fms
        GROUP BY id_factura_de_venta)
    ) AS result
    LEFT JOIN montos_pago_v mv ON result.id_factura_de_venta=mv.id_factura_de_venta
    GROUP BY result.id_factura_de_venta)
    UNION ALL
    (SELECT DISTINCT f.id_factura_de_venta, ncv.numero_ncv, ncv.fecha_contable_ncv, ncv.fecha_ncv, 
    f.anular_fv, f.id_cliente, 'Nota crédito' AS tipo, c.rut, c.nombre,
    ncv.valor_descontado_ncv AS total_neto, ROUND(ncv.valor_descontado_ncv*0.19) AS iva, SUM(IFNULL(m.monto_pago, 0)) AS pago
    FROM notas_credito_ventas ncv 
    JOIN facturas_de_ventas f ON ncv.id_factura_de_venta=f.id_factura_de_venta AND f.anular_fv=0
    JOIN clientes_y_proveedores c ON f.id_cliente=c.id_cliente_o_proveedor 
    LEFT JOIN montos_pago_ncv m ON ncv.id_nota_credito_venta=m.id_nota_credito_venta
    WHERE ncv.valor_descontado_ncv != 0
    GROUP BY ncv.id_nota_credito_venta
    ORDER BY ncv.id_nota_credito_venta) 
)AS r
WHERE tipo!='boleta' AND MONTH(fecha_contable_fv) =11 AND YEAR(fecha_contable_fv) =2019;

我检查了一下,问题出在最后的 WHERE 子句中,特别是在“tipo!='boleta'”之后,因为我单独证明了括号中的所有其他查询并且它们有效,并且我还删除了部分“AND MONTH(fecha_contable_fv)= 11 AND YEAR(fecha_contable_fv) =2019",在这种情况下,它可以在 MariaDB 的托管中使用,我重复一遍,相同的查询可以在其他使用 Mysql 的托管中完美运行。所以问题应该是新主机中的某个选项,或者可能是导出方式,或者现在我正在使用 MariaDB,我应该更正很多查询。我希望有一个人可以帮助我。提前致谢。

标签: mysqlmariadbmysql-error-1054

解决方案


你不能在里面tipofecha_contable_fv里面移动测试吗?那就是在执行所有and之前进行过滤。UNIONingGROUPing

这是一种一步完成日期检查的方法(没有更快,只是更简洁):

fecha_contable_fv LIKE '2019-11%'

如果有可用的索引,我建议:

    fecha_contable_fv >= '2019-11-01'
AND fecha_contable_fv  < '2019-11-01' + INTERVAL 1 MONTH

完整的错误信息是什么?它不是说的不仅仅是“#1054 - order 子句中的未知列错误”


推荐阅读