Hola a todos:
Estoy tratando de crear una consulta SQL para una base de datos MySql 5.7.11 para eliminar todos los registros que cumplen con la siguiente condición:
Se trata de un sistema de tarifas, una tabla tarifa esta relacionada con la tabla precios en una relación uno-a-muchos, y cada precio se relaciona con un producto.
Debido a que las tarifas se crean mediante acciones en lote a veces en una tarifa quedan registrados varios precios para un mismo producto. Mi intención es mantener en cada tarifa solo el ultimo precio(el de mayor id) para cada producto y eliminar los precios anteriores, para ello estoy utilizando la siguiente consulta:
DELETE p
FROM ges_precio as p
WHERE p.tarifa_id = :tarifa
and id <
(select max(a.id) as id
from ges_precio a
where a.tarifa_id = :tarifa
and p.producto_id = a.producto_id
)
Pero estoy recibiendo el siguiente error:
You can't specify target table 'p' for update in FROM clause
He tratado de encapsular la subquery en otro select y usar un alias para solucionarlo pero no he podido.
Estoy buscando una forma de realizar la consulta, sin usar una subquery en el FROM que consulte a la tabla precio, pero no se me ocurre nada.
ACTUALIZACIÓN:
Voy a poner un ejemplo para que se entienda mejor lo que pretendo hacer, esta es la tabla ges_precio:
*La consulta se ejecutará para la tarifa 1 así que se pueden ignorar los registros de la tarifa 2
id | importe | tarifa_id | producto_id
1 | 24 | 1 | 24
2 | 16 | 1 | 53
3 | 18 | 1 | 24
4 | 20 | 2 | 23
5 | 22 | 2 | 24
6 | 18 | 2 | 23
Ahora mismo la tarifa 1 consta de tres precios, el problema es que dos de ellos hacen referencia al mismo producto 24, en este caso quiero desechar el precio mas antiguo para esta tarifa y el producto 24, es decir tras usar la consulta para la tarifa 1 la tabla debería quedar de la siguiente manera:
id | importe | tarifa_id | producto_id
2 | 16 | 1 | 53
3 | 18 | 1 | 24
4 | 20 | 2 | 23
5 | 22 | 2 | 24
6 | 18 | 2 | 23
Espero que me puedan ayudar.