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

Ni NOT LIKE ni WHERE NOT EXISTS

Estas en el tema de Ni NOT LIKE ni WHERE NOT EXISTS en el foro de Mysql en Foros del Web. A ver si alguien me puede echar una mano. Os comento. En la BD tengo una tabla con un campo tipo text donde están las ...
  #1 (permalink)  
Antiguo 25/08/2012, 06:33
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 11 años, 11 meses
Puntos: 2
Ni NOT LIKE ni WHERE NOT EXISTS

A ver si alguien me puede echar una mano. Os comento.

En la BD tengo una tabla con un campo tipo text donde están las ids de todos los usuarios que un determinado usuario tiene bloqueados. Cada vez que un usuario bloquea a otro se añade al campo 'bloqueados' un guión y la id del usuario bloqueado. De esta manera, el campo bloqueados de cada usuario tendría esta forma:

-42-154-88 etc.

Vale, ahora se trata de que cuando un usuario busca a otros, no le salgan aquellos usuarios que tiene bloqueados dicho usuario. Lo he probado de dos maneras diferentes, partiendo de la premisa de que la variable $id contiene la id de un usuario bloqueado.


Código PHP:
Ver original
  1. "SELECT  nick FROM usuarios
  2. WHERE conectado = 's'
  3. AND bloqueados NOT LIKE '%-$id-%'";

y tampoco funciona así

Código PHP:
Ver original
  1. "SELECT  nick FROM usuarios
  2. WHERE conectado = 's'
  3. AND NOT EXISTS (
  4.        SELECT nick FROM usuarios
  5.        WHERE bloqueados LIKE '%-$id-%' )";

Lo curioso es que si lo hago al revés, esto es, LIKE en lugar de NOT LIKE, encuentro a los usuarios bloqueados, así que por lo tanto lo que estoy haciendo mal tiene que ver con la negación de la condición, pero no sé ver el fallo.

Gracias anticipadas y perdón por el ladrillazo que he soltado.
  #2 (permalink)  
Antiguo 25/08/2012, 08:38
Avatar de antoniopol  
Fecha de Ingreso: agosto-2012
Ubicación: Valladolid
Mensajes: 114
Antigüedad: 11 años, 7 meses
Puntos: 21
Respuesta: Ni NOT LIKE ni WHERE NOT EXISTS

Considero que deberías replantearte la base de datos y crear una tabla mas de usuarios_bloqueados con dos campos que deberían ser primary key: usuario, usuario_bloqueado, así la sentencia para sacar esos usuarios sería mas sencilla, por ejemplo si quisieras sacar la lista de usuarios no bloqueados de "garcia" sería la siguiente sentencia:
Código PHP:
Ver original
  1. Select nick from usuarios where nick='garcia'
  2. and nick not in
  3.             ( select usuario_bloqueado from usuarios_bloqueados
  4.               where usuario='garcia');
  #3 (permalink)  
Antiguo 25/08/2012, 11:42
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 11 años, 11 meses
Puntos: 2
Respuesta: Ni NOT LIKE ni WHERE NOT EXISTS

Antes que nada, gracias por responder.

Mi primera aproximación iba por donde tú comentas. Lo que sucede es que al no saber el número de usuarios que alguien va a bloquear, (hay gente muy insociable por ahí ) se
me ocurrió esta forma, ya que en caso contrario o bien le dejo un número cerrado de posibilidades de bloqueo a los usuarios para asignarlo a unas variables preestablecidas, o bien abro una tabla abierta donde se pueda duplicar tanto la id del que bloquea como la del bloqueado.

Persistiendo en mi idea, estaba comprobando que el NOT LIKE me funciona siempre que no lo encadene con otro where, esto es:

"SELECT nick FROM usuarios
WHERE bloqueados NOT LIKE '%-$id-%'";

me funciona, pero

"SELECT nick FROM usuarios
WHERE conectado = 's'
AND bloqueados NOT LIKE '%-$id-%'";

no. Debo ser el mamífero más tonto del mundo, pero no entiendo por qué.
  #4 (permalink)  
Antiguo 25/08/2012, 12:07
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 11 años, 11 meses
Puntos: 2
Respuesta: Ni NOT LIKE ni WHERE NOT EXISTS

Pues al final la solución estaba en otro lado. La indico aquí por si a alguien le resultara de ayuda/interés:

Resulta que al campo 'bloqueados' se me ocurrió la feliz idea de darle un valor por defecto NULL, pensando en aquella gente que no bloquearía a nadie. Parece ser (no lo sé, pero lo deduzco a raíz de los resultados) que no se puede usar NOT LIKE con valores nulos. Meramente quité el valor por defecto y funciona.

Gracias, antoniopol por tu interés.
  #5 (permalink)  
Antiguo 26/08/2012, 08:10
Avatar de antoniopol  
Fecha de Ingreso: agosto-2012
Ubicación: Valladolid
Mensajes: 114
Antigüedad: 11 años, 7 meses
Puntos: 21
Respuesta: Ni NOT LIKE ni WHERE NOT EXISTS

Es que los valores NULL suelen dar problemas, de todos modos, antes de ponerte a codificar plantea bien una buena base de datos escalable para el futuro, aunque muchos de nosotors no lo hagamos siempre (donde mi incluyo) muchas veces ganas mas tiempo haciendolo.
__________________
>> Blog de desarrollo web.
>> @antoniopol06 amante de la Web =D
  #6 (permalink)  
Antiguo 26/08/2012, 08:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ni NOT LIKE ni WHERE NOT EXISTS

roncco: Lo que corresponde hacer, cuando tienes una relación N:N como la que planteas, es, en tu caso, crear una tabla relacional donde se instancia a cada ID de un usuario bloqueado, con el ID del bloqueador.
Nunca, ni en tus mayores pesadillas, se te debe pasar por la mente usar un campo multivaluado. No sólo son una violación al modelo relacional, sino que son la garantía de enormes problemas para la generación de consultas para el futuro.
Los campos multivaluados están completamente prohibidos en el modelo E-R. Tenlo siempre presente. Su presencia implica que el diseño de la base simplemente está mal hecho.
No exagero: Proponer un campo multivaluado en un examen de Bases de Datos I es la garantía de reprobarlo, sin necesidad de seguir revisando las siguientes respuestas.
__________________
¿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; 26/08/2012 a las 09:44

Etiquetas: exists, tabla, variables, usuarios
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 10:22.