Parametrizar consulta en MySQL usando @variables

Introducción

Hace poco en un proyecto personal he empezado a usar variables en mis consultas SQL para probarlas en mi cliente HeidiSQL. De esto modo puedo verificar el funcionamiento de las mismas como las construye mi framewoork codeigniter.

Por poner un ejemplo, en PHP plano se escribiría algo así:

$select = 'select * from cosas where precio > ', ($miprecio + $parametro) ' and precio < ', ($miprecio * 10) ;.

Pero claro, lo ideal es poder usar en MySQL una construcción con el mismo aspecto, ¿cómo? Usando las variables que nos ofrece en SQL.

Ejemplos

Supongamos una tabla de viviendas con su id, nombre y precio de mercado como la siguiente:

select id, nombre, precio_de_venta from kaza_viviendas
id nombre precio_de_venta
12 Villa Atlas 1470000
10 Villa Chronos 1350000
11 Villa Hermes 780000
6 Villa Marfil 1300000
8 Villa Eos 850000
9 Villa Pegasus 670000

Si queremos el precio más bonito y usando otro nombre:

select id, nombre, format(precio_de_venta, 2) as precio from viviendas 
id nombre precio
12 Villa Atlas 1,470,000.00
10 Villa Chronos 1,350,000.00
11 Villa Hermes 780,000.00
6 Villa Marfil 1,300,000.00
8 Villa Eos 850,000.00
9 Villa Pegasus 670,000.00

A continuación, vamos a crear dos parámetros “horquilla” y “precio_referencia”. El primero establece un límite sobre el que buscar precio “similares” al dado por “precio_referencia”:

set @precio_referencia=1470000;
set @horquilla=25000;
select id, nombre, format(precio_de_venta, 2) as recio
from viviendas
where precio_de_venta >= (@precio_referencia - @horquilla)
  and precio_de_venta <= (@precio_referencia + @horquilla);

Como vemos sólo nos devuelve una. Pero para generar y probar una lista de viviendas similares con este u otro criterio resulta muy útil y rápido

id nombre recio
12 Villa Atlas 1,470,000.00

Estos ejemplos son muy sencillo y tontos, pero creo que ilustran a grandes rasgos lo que quiero decir, además estoy seguro que para construir consultas más complejos con mayor cantidad de cruzas y condiciones podría ser de gran ayuda.

Conclusión

En desarrollo personalmente no me gusta usar variables de MySQL, aunque con ejemplos como el anterior si que veo muy claro lo que facilita la depuración del SQL y ayuda a la hora de construir consultas muy complejas con muchos datos cruzas y poder probar diferentes casos.

15 thoughts on “Parametrizar consulta en MySQL usando @variables

  1. Pingback: Parametrizar consulta en MySQL usando @variables » DbRunas

  2. Alguien me puede ayudar con est:

    declare @column nvarchar(7);
    declare @IdConc int;
    declare @Contador int;
    set @Contador = 0;
    while @Contador < 2
    begin
    set @column = 'IdConc'+cast(@Contador as varchar);
    set @IdConc = (select @column from DatosProyec);
    set @Contador = @Contador + 1;

    print 'valor :' +cast(@IdConc AS varchar);

    end

    Mi problema es que quiero moverme a través de las columnas
    de mi tabla para obtener los registros de estas pero me marca error de
    compatibilidad de variables y es que el que quiero obtener es un numérico no
    texto

  3. Tengo este código realizado para una vista en HeidiSql que poniendo un valor me funciona pero no consigo que me funcione poniendo un parámetro. Declaro una variable y luego pongo el igual a @variable pero da error.

    SELECT clientes.dni,clientes.nombre,provincias.provincia,Clientes.cp,municipios.municipio,clientes.calle,clientes.numero,gestion.fecha,gestion.fecha1,gestion.juntas,gestion.texto
    From clientes
    INNER JOIN GESTION ON clientes.dni = gestion.dni
    INNER JOIN MUNICIPIOS ON clientes.cp = municipios.cp
    INNER JOIN PROVINCIAS ON clientes.idprov = provincias.idprov
    Where clientes.dni= ‘15681942 R’

  4. Hola Jose
    Tengo un programa en Visual Studio con este código.
    Open()
    Dim Sql As String
    Sql = “Select ” & campo & ” From ” & miTabla & ” Where ” & clave & ” like ‘” & Texto & “%'”
    Dim cmd As New MySql.Data.MySqlClient.MySqlCommand(Sql, cn)
    Return CStr(cmd.ExecuteScalar)

    Pero lo que ahora quiero es hacer una consulta en MariaDB y pasarle los parámetro en la llamada desde del programa.
    Pregunto si es posible hacerlo ya que no he visto documentación sobre esta forma de trabajar.

  5. hola me podrian ayudar quiero sacar el total de horas de una tabla la entrada y salida estan en una misma columna pero quiero sacar las horas extras despues de las 5 las horas laboradas despues de los sabados a medio dia y las horas laboradas si es un domingo se puede?

    • Buenos días, poder se debe poder. Ten en cuenta que A) No sabemos que DBMS estás usando y B) no sabemos la estructura de la tabla. Para solucionarlo debes partir el problema en subproblemas:
      – Dada una fecha (conocer el día de la semana, para discrimar entre semnaa, sábado y domingo)
      – Suponiendo que tienes un flag que marca entrada/salida diferenciar con este flag para hacer el computo entre entradas y salidas
      – Unir todas las condiciones para obtener la suma

  6. Buenas tardes, no se si me podrás ayudar con esta duda que tengo. Si ejecuto esta sentencia SQL desde phpmyadmin me devuelve los resultados correctamente:
    “set @total:=0;
    select id_pm_s, fecha, tipo, cantidad, destino, observaciones, @total:=cantidad+@total as Saldo from
    libros_pm_salidas;”
    (es para calcular una columna “saldo” automáticamente)
    Mi pregunta es como puede pasar esta consuta sql en el códiog php? He probado de varias formas y me da errores.
    Ejemplo: $query = sprintf(“set @total:=0; select id_pm_s, fecha, tipo, cantidad, destino, observaciones, @total:=cantidad+@total as Saldo from libros_pm_salidas; WHERE Fecha BETWEEN ‘$year/$min’ AND ‘$year/$max’ ORDER BY fecha Asc”);

    ¿Como se incluye una variable auxiliar de sql en una consulta php?

    • Hola, te voy a contestar “de memoria”. En PhpMyAdmin puedes ejecutar un lote de sentencias SQL sin problema. Pero en PHP si estás usando la extensión mysqli el método query (http://php.net/manual/es/mysqli.query.php) tienes que ejecutar sentencia a sentencia. Es decir: 1) declara la variables y 2) usala en tu SELECT. No te preocupes, al estar dentro de la misma sesión de base de datos no se borra. Sería algo así:


      $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
      if ($mysqli->connect_errno) {
      exit();
      }

      $mysqli->query("set @total:=0");
      $resultado = $mysqli->query(sprintf(“select id_pm_s, fecha, tipo, cantidad, destino, observaciones, @total:=cantidad+@total as Saldo from libros_pm_salidas WHERE Fecha BETWEEN ‘$year/$min’ AND ‘$year/$max’ ORDER BY fecha Asc”);
      ....

      Ya ajustas tus parámetros de conexión y la consulta SQL de la SELECT.

      Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *