你好,我用这种类型的句子在我准备的语句中返回一个自动递增列,选择
cnt := cnt + 1
SET @query = CONCAT('SELECT * FROM (SELECT (@cnt := @cnt + 1) AS id, a.idProducto idProducto, a.idExProducto idExterno, trim(a.descripcion) nombreProducto, trim(a.descripcionAlt) nombreLargoProducto, trim(a.serial) serial,',
' a.peso, a.volumen, a.IdTpoGrupo, trim(b.descripcion) nombreGrupo,',
' a.idTpoLinea, trim(c.descripcion) nombreLinea,',
' a.idTpoMarca, trim(d.descripcion) nombreMarca,',
' a.idTpoUnidad, trim(e.descripcion) nombreTipoUnidad,',
' CASE WHEN a._estado = 1 THEN ''true'' ELSE ''false'' END estado, ',
' g.nombreArchivo imagen ',
' FROM tblProducto a',
' INNER JOIN tblProducto_TpoGrupo b ON a.IdTpoGrupo = b.IdTpoGrupo',
' INNER JOIN tblProducto_TpoLinea c ON a.idTpoLinea = c.idTpoLinea',
' INNER JOIN tblProducto_TpoMarca d ON a.idTpoMarca = d.idTpoMarca',
' INNER JOIN tblTpoUnidadMedida e ON a.idTpoUnidad = e.idTpoUnidadMed ',
' LEFT JOIN tblProductoXImagen f ON a.idProducto = f.idProducto AND f._estado=1',
' LEFT JOIN tblImagen g on f.idImagen = g.idImagen AND g._estado=1',
' WHERE a._estado<2 ',whereLike,whereConcat, ' order by idProducto ) allrecords');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
它在MySQL 5上运行得很好,但现在在MySQL 8中被弃用,我的事务返回了一个警告,但该警告停止了我的存储过程的执行,我想知道是否有解决方案可以在MySQL 8上实现这种行为。
谢谢你的帮助。
您可以使用窗口函数。你想要的逻辑是:
row_number() over(order by idProducto) as id
这将为您提供一个递增的整数值,该整数值从1
开始,并根据idProducto
递增。如果结果集中的两行具有相同的idProducto
,则未定义哪一行将被排序";第一个";(但是,可以保证它们不会得到相同的行号(-在这种情况下,您可能希望向order by
子句添加一个或多个列,这样您就可以得到可预测的、稳定的结果。