Puede que te parezca muy largo pero es más fácil de programar.
El problema de manipular variables en una sentencia (que sí se puede hacer) es que deben operarse en una subconsulta porque la primera vez que las usas
no tienen tipo y solo valen NULL (fijate en las FAQ de MySQL, allí puse un caso tipo), ya que es el momento en que empiezan a existir.
El segundo problema es ubicar su funcionamiento. Cuando pones una variable en un SELECT, el valor de la variable cambia en el mismo orden de aparición secuencial de uso.
Para darte un ejemplo, suponiendo que @a ya exista, y que valga cero, esta sentencia:
Código sql:
Ver originalSELECT IF(@a =0, 'PRIMERA', 'SEGUNDA') Posicion, @a:=1 orden
FROM tabla;
hará que la primera línea devuelta diga "PRIMERA", pero las siguientes devolverán "SEGUNDA". ¿Cómo puede ser? Simplemente porque al procesar el primer IF de la primera línea, la variable vale cero; pero cuando procesa el segundo miembro del SELECT, la variable pasa a valer 1, con lo que al procesar la segunda línea ya no vale cero.
Si quieres ver un resultado curioso, cruza esta sentencia con cualquier tabla que tengas, cambiando el nombre de "tabla", con el de cualquiera que desees (esto te representará mejor el cambio de valores dinámico de una variable):
Código SQL:
Ver originalSELECT Posicion FROM
(SELECT
IF(@a =0, 'PRIMERA', 'SEGUNDA') Posicion,
IF(@a = 1,@a:= 0, @a:=1) orden
FROM TABLA JOIN (SELECT @a:=0 ) t1)T1
;
El problema de manipular valores en variables de usuario dinámicas, consiste en controlar la secuencia de reasignaciones de modo que el resultado sea correcto. Cada miembro y cada línea procesados afectan a la variable si la misma tiene resignaciones en alguno de ellos.
¿Se comprende?
Un tipo final para tener en cuenta:
La variable de usuario usada en una consulta sigue existiendo mientras la conexión en la que se creó siga abierta. Dependen de ellas.
También tienes que tener en cuenta que una vez que la creaste y usaste, si la conexión no se cierra, la variable conserva el último valor que se cargó en ella. Si piensas volver a usarla inmediatamente, debes reinicializarla.