Autor Tema: [mySQL] ¿Simplificar esta consulta?  (Leído 5633 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Psyke1

  • Megabyte
  • ***
  • Mensajes: 130
  • Reputación: +11/-7
  • VBManiac
    • Ver Perfil
    • h-Sec
[mySQL] ¿Simplificar esta consulta?
« en: Febrero 15, 2013, 08:28:39 am »
Tengo la siguiente tabla y consulta: Ver en SqlFiddle.
Ahí extraigo todos los ids de los elementos que tienen cm_min y cm_max dentro del rango ingresado, en este caso 13 y 66.

¿Se os ocurre alguna forma de simplificar esta consulta?

Gracias.
DoEvents! :P

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:[mySQL] ¿Simplificar esta consulta?
« Respuesta #1 en: Febrero 15, 2013, 09:06:32 am »
Con esta consulta obtengo los mismos resultados :P

Código: (sql) [Seleccionar]
  SELECT * FROM sizes
  WHERE cm_min >= 13 AND cm_min <= 66 OR
  cm_max >= 13 AND cm_max <= 66
ORDER BY cm_max ASC;

Psyke1

  • Megabyte
  • ***
  • Mensajes: 130
  • Reputación: +11/-7
  • VBManiac
    • Ver Perfil
    • h-Sec
Re:[mySQL] ¿Simplificar esta consulta?
« Respuesta #2 en: Febrero 15, 2013, 09:59:44 am »
Creo que tengo la solución a lo que quería hacer.

También quería sacar el valor más bajo y/o el más alto en en caso de que estuviera fuera de los rangos.
Mira:
http://sqlfiddle.com/#!2/83e93/174/1

¿Eso lo puedes simplificar? :P

DoEvents! :P

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:[mySQL] ¿Simplificar esta consulta?
« Respuesta #3 en: Febrero 15, 2013, 10:25:32 am »
Código: (sql) [Seleccionar]
SET @v1=12, @v2=63;

SET @min=(SELECT MIN(cm_min) FROM sizes);
SET @max=(SELECT MAX(cm_max) FROM sizes);

SELECT *
FROM   sizes
WHERE  (
       cm_min BETWEEN @v1 and @v2
       AND
       cm_max BETWEEN @v1 and @v2
       )
OR
  IF(cm_min = @min, 1, 0) = 1
OR
  IF(cm_max = @max, 1, 0) = 1
ORDER BY cm_max ASC;

Tu consulta estaba mal, el más alto era el cm_max 86 (el de id 5) y no lo devolvia :P fijate con eso, creo que esta bien, devuelve los valores en el medio y los de las puntas de los extremos

Psyke1

  • Megabyte
  • ***
  • Mensajes: 130
  • Reputación: +11/-7
  • VBManiac
    • Ver Perfil
    • h-Sec
Re:[mySQL] ¿Simplificar esta consulta?
« Respuesta #4 en: Febrero 15, 2013, 01:16:12 pm »
Lo siento, me expliqué mal. Los valores de mi consulta son correctos. ::) :-\

Lo que quiero es que si los valores que introduzco son más pequeños que los que hayan en la tabla, entonces retornará la fila con cm_min y cm_max menores. :P Te pongo unos ejemplos:


Para estos valores:
Código: [Seleccionar]
SET @v1=8, @v2=9;Debería de devolver el mayor rango de la tabla, en este caso el que tiene el id 7 (12, 14)

Y para estos otros valores:
Código: [Seleccionar]
SET @v1=99, @v2=109;Debería de devolver el mayor rango de la tabla, en este caso el que tiene el id 5 (83, 86)


¿Me explico? :)
¡Muchas gracias!

DoEvents! :P



EDIT:
Igual no me queda otra que hacerlo con varias consultas. Porque quiero que para estos valores:

Código: [Seleccionar]
SET @v1=80, @v2=99;
Ningún registro de la tabla comprende el número 80. En este caso mi código me devuelve el id 5, pero si el número de comienzo está desierto, quiero que me saque el segundo más grande en la misma consulta también, ¿me explico?

Hay que ver como me cuesta expresarme siendo una cosa tan sencilla. ;D

DoEvents! :P
« última modificación: Febrero 15, 2013, 02:00:20 pm por Psyke1 »

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:[mySQL] ¿Simplificar esta consulta?
« Respuesta #5 en: Febrero 15, 2013, 04:35:32 pm »
No entiendo bien la logica de lo que quieres buscar, quizás puedas explicarte mejor :P

El codigo del SQL no hace falta la union, solo con el OR basta

Código: (SQL) [Seleccionar]
SET @v1=8, @v2=9;

SELECT *
FROM   sizes
WHERE  (
       cm_min BETWEEN @v1 and @v2
       AND
       cm_max BETWEEN @v1 and @v2
       )
OR
       cm_min = (
         SELECT MIN(cm_min)
         FROM   sizes
         WHERE  (@v1+@v2) <= (cm_min + cm_max)
         )
OR
       cm_max = (
         SELECT MAX(cm_max)
         FROM   sizes
         WHERE  (@v1+@v2) >= (cm_min + cm_max)
         )
ORDER BY cm_max ASC;
;

Psyke1

  • Megabyte
  • ***
  • Mensajes: 130
  • Reputación: +11/-7
  • VBManiac
    • Ver Perfil
    • h-Sec
Re:[mySQL] ¿Simplificar esta consulta?
« Respuesta #6 en: Febrero 15, 2013, 05:20:33 pm »
Gracias por responder raul.
Resulta que repasando el esquema que tengo me di cuenta de que lo que necesito es otra cosa diferente. :(

Dados v1 y v2:
Sacar la fila anterior más pequeña y posterior más grande, y todas las filas que tengan el rango entre v1 y v2.

No parece muy difícil. :P
Esta vez, creo que me expliqué bien y todo. :)


DoEvents! :P

« última modificación: Febrero 15, 2013, 05:35:40 pm por Psyke1 »

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:[mySQL] ¿Simplificar esta consulta?
« Respuesta #7 en: Febrero 16, 2013, 11:39:34 am »
Pero cuando hablas de la fila, hablas comparando que, cm_min ? cm_max? si o si las 2 ?

de las filas que vienen insertadas ahí, cual seria la "mayor de todas"? y la "menor" ?

Psyke1

  • Megabyte
  • ***
  • Mensajes: 130
  • Reputación: +11/-7
  • VBManiac
    • Ver Perfil
    • h-Sec
Re:[mySQL] ¿Simplificar esta consulta?
« Respuesta #8 en: Febrero 21, 2013, 05:10:15 pm »
Gracias por la ayuda raul. No te preocupes, volví a repasar y simplifiqué la forma de hacerlo. :)

DoEvents! :P