Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

subquery en un like

Estas en el tema de subquery en un like en el foro de Mysql en Foros del Web. hola! estoy intentando cambiar el horario establecido en mi sistema según sea día de diario o fin de semana, para ello tengo un campo que ...
  #1 (permalink)  
Antiguo 07/03/2012, 06:11
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
subquery en un like

hola! estoy intentando cambiar el horario establecido en mi sistema según sea día de diario o fin de semana, para ello tengo un campo que se llama diaDeSemana:

Código:
-----------------------------------
| horarioID | diaDeSemana |
-----------------------------------
|              1 |        2 3 4 5 6 |
-----------------------------------
|              2 |                 1 7 |
-----------------------------------
Quiero saber que horarioID tengo el día de hoy, esta es un poco mi idea:

Código:
mysql> SELECT horarioID FROM horario WHERE diaDeSemana LIKE (SELECT DAYOFWEEK(NOW()));
Empty set (0.00 sec)
¿Cómo podría hacer la comparación?

Gracias!
  #2 (permalink)  
Antiguo 07/03/2012, 06:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: subquery en un like

LIKE opera sobre cadenas de texto, no sobre numeros, mientras que DAYOFWEEK() devuelve un número y NOW() una fecha. Como verás, son contextos totalmente diferentes.
Por otro lado, razóalo así: LIKE significa esencialmente "parecido a..." o "contiene algo como...", y cuando trabajas con números no existen los "parecidos", existen igualdades, desigualdades, rangos, etc. Pero no numeros "parecidos".
Además de esto, hacer una subconsulta para obtener el resultado de una función nativa no aplicada a una tabla... es algo bastante absurdo. Para eso usas directamente la función. ¿No te parece?
Corresponde entonces algo como:
Código MySQL:
Ver original
  1. SELECT horarioID
  2. FROM horario
  3. WHERE DAYOFWEEK(diaDeSemana) = DAYOFWEEK(NOW());
Esto, en tanto diaDeSemana sea una fecha.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 07/03/2012, 07:05
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
Respuesta: subquery en un like

Hola, gracias por tu respuesta, pero creo que no me has entendido.

Lo que quiero es especificar que días existirá un horario y que días no lo hará.

por tanto lo que quiero es que el campo "diaDeSemana" contenga el número del día de hoy.

Puesto que me dices que el error está en los tipos de datos, he añadido un "cast" pero sigue sin funcionar:

Código:
SELECT horarioID from horario where diaDeSemana like "%(SELECT convert(DAYOFWEEK(NOW()) using utf8))%";
El problema que estoy teniendo es que el Like no me toma el valor que devuelve la subquery, sino la cadena de texto que la forma.

¿Cómo puedo decirle que quiero que resuelva la subquery?

Gracias.
  #4 (permalink)  
Antiguo 07/03/2012, 07:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: subquery en un like

Si diaDeSemana contiene un valor entre 1 y 7, de acuerdo al día de la semana en cuestión, la consulta es por aquellos registros cuyo valor sea igual al DAYOFWEEK() del día de hoy.
Por cierto, esa subconsulta es absolutamente innecesaria, ya te lo he dicho. Y también te aclaré que LIKE no opera con numeros, sino con cadenas de texto, y eso implica a los dos parámetros: el valor de la columna comparada y el valor a comparar.
Trata de comprenderlo: NO SE USA LIKE CUANDO OPERAS CON NUMEROS.
¿Por qué insistes en usar esa cláusula?

Código MySQL:
Ver original
  1. SELECT horarioID
  2. FROM horario
  3. WHERE diaDeSemana = DAYOFWEEK(NOW());
Esto devuelve todos los horarioID donde el valor de diaDeSemana sea exactamente igual al numero de de dia de la semana devuelto por DAYOFWEEK().
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 07/03/2012, 08:31
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
Respuesta: subquery en un like

Si no me entiendes, no respondas, lo que es absurdo es responder a preguntas que no se entienden.

Esa comparación no me sirve.

Lo que quiero es saber como insertar una subquery en un LIKE para que la entienda como subquery y no como comparar con "select blablabal"
  #6 (permalink)  
Antiguo 07/03/2012, 09:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: subquery en un like

En primer lugar, para poder usar una subconsulta con una cláusula como LIKE, la misma tiene que devolver un único valor, y este valor debe ser de ccadena (texto).
Espero que eso ya lo tengas claro.
En segundo lugar, para poder usar subconsulta en ese conexto, deberás crear la cadena, porsiblemente con CONCAT(), aunque francamente no estoy seguro de que te sirva. Es probable que genere un error de sintaxis.
Pruébalo así:
Código MySQL:
Ver original
  1. SELECT horarioID
  2. FROM horario
  3. WHERE diaDeSemana LIKE CONCAT('%', DAYOFWEEK(NOW()), '%');
Lo que yo no entiendo es por qué necesitas usar LIKE, si el campo diaDeSemana es un numérico... ¿O le metiste una serie de valores separados por espacios o comas?

Finalmente: No seas grosero. Estoy tratado de ayudarte y entender qué es lo que quieres lograr, sin que me hayas contestado una sola pregunta...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 07/03/2012 a las 09:23
  #7 (permalink)  
Antiguo 07/03/2012, 09:33
 
Fecha de Ingreso: junio-2011
Mensajes: 139
Antigüedad: 13 años, 6 meses
Puntos: 42
Respuesta: subquery en un like

Hola cucuru,

En primer lugar las preguntas o respuestas fuera del contexto de colaborar, ayudar o aportar de manera positiva estan fuera de lugar, se acepta todo tipo de crítica positiva de manera respetuosa.

Al margen de lo anterior, colocar la estructura de la tabla "horario" sería de gran ayuda, sin embargo, entiendo que la columna "diaDeSemana" es de tipo texto ya que usas un LIKE, bajo esta premisa muestro un ejemplo que te puede ayudar http://www.sqlfiddle.com/#!2/27860/1
  #8 (permalink)  
Antiguo 07/03/2012, 10:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: subquery en un like

Observando lo que dice Wchiquito, noto que no me había fijado la forma en que manejas esos datos de ese campo. Efectivamente los estás poniendo como cadena de texto. Y allí está el problema principal: Estás usando un campo multivaluado, cosa prohibida en las bases de datos relacionales.
Este es un tema recurrente, pero para que se entienda: Si tienes una relación 1:N entre horario y día, día debe ser una tabla independiente, que contenga un registro por cada día que el horario se cumple.
El que quieras "ahorrar" espacio sólo te llevará a problemas de este tipo y peores, cuando intentes el mismo tipo de "parche" para otras relaciones de esa clase (o peor, las N:N).
En otras palabras: Tienes la tabla mal diseñada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: select, sql, subquery, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:43.