Usar variable en MySQL UNION ALL

babri

Buenos días buen pueblo de MV.

Hoy me toca optimizar ciertas consultas SQL antes de arreglar una movida que nos han montado en cierta parte de la aplicación.

Resulta que tenemos uns consulta MySQL, de la cual extraemos X número de filas.
Lo malo es que son varias consultas iguales con ciertos parámetros unidas con un union.

El problema? Basicamente es que debemos de calcular el límite del producto_2 en base a la cantidad que obtenemos del prodcuto_1:

Ejemplo: Producto_1 tiene 600 fillas, producto_2 debería de tener un limit 600*0.9 (redondeado sin decimales ofc).

Osea se calcular el limit del segundo producto en base del total de producto_1.

Lo malo es que lo han montado con eloquent y está ejecutando una raw así que es como si fuera una sola sentencia, no puedo hacer un procedimiento, no se si se puede hacer directamente sobre query.

(producto_1)

UNION ALL

(producto_2)

Un saludo!

Ranthas

Has probado SELECT ... FROM (aqui metes el churro del union) WHERE ... ORDER BY....??

Es decir, meter tu SQL de los union en el from de otra sql y en esa sql externa aplicar los filtros, ordenacion, etc que necesites.

1 respuesta
babri

#2 entonces no puedo sacar el número que necesito, un ejemplo más práctico:

SELECT * FROM emple WHERE pelo = 'RUBIO'; (se que hay un total de 600 registros)

UNION ALL

SELECT * FROM emple WHERE pelo = 'CASTAÑO' LIMIT 600*0.9; (El limit lo calculas en base a los 600 registros recuperados en la primera consulta).

Todo en una sola sentencia.

2 respuestas
Ranthas

#3 Vale, ya veo, ya veo

Pues tendras que usar una variable para almacenar el valor del LIMIT. Si el ORM que usas no te deja, habría que mirar como ejecutar esa SQL de manera nativa desde el ORM.

Otra idea es almacenar un stored procedure en la BBDD que se encargue de sacar esa información, y que la aplicación llame al SP; a esto suelo recurrir con frecuencia, cuando la sql en cuestión es demasiado compleja.

COSMOS

#3 echa un ojo al with: https://dev.mysql.com/doc/refman/8.0/en/with.html

1 respuesta
kritita

#5 Iba a decir lo mismo.

WITH ... AS

y después haces tu SELECT con el UNION ALL pero usando esa tabla auxiliar que has creado en la misma consulta

babri

el with sería mi salvación... es justo lo que necesito D:

pero está instalada la version 5.6 T_T

Usuarios habituales

  • babri
  • kritita
  • COSMOS
  • Ranthas