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

Left Join con condición que devuelva campos NULL si no hay coincidencia

Estas en el tema de Left Join con condición que devuelva campos NULL si no hay coincidencia en el foro de Mysql en Foros del Web. Buenas, tengo una tabla "usuarios" con un campo "nick" entre otros y otra "solicitudes" con un campo "tipo" que puede contener varios valores, pero no ...
  #1 (permalink)  
Antiguo 28/06/2012, 09:42
danihxh
Invitado
 
Mensajes: n/a
Puntos:
Left Join con condición que devuelva campos NULL si no hay coincidencia

Buenas, tengo una tabla "usuarios" con un campo "nick" entre otros y otra "solicitudes" con un campo "tipo" que puede contener varios valores, pero no puede contener dos solicitudes de un mismo usuario y del mismo tipo. Por ejemplo, un usuario "David" podría tener dos solicitudes, pero de distinto tipo.

Necesito hacer una consulta parecida a la siguiente, pero en la cuál se puedan buscar solicitudes de un tipo determinado:

SELECT usuarios.id, solicitudes.id, solicitudes.tipo FROM usuarios LEFT JOIN solicitudes ON usuarios.id=solicitudes.solicitante WHERE nick='XXX' LIMIT 1;


El problema es que esta consulta funciona bien cuando el usuario no tiene ninguna solicitud, en cuyo caso devuelve (ID del usuario, NULL, NULL), pero si utilizo "WHERE nick='XXX' AND tipo=N" y el usuario no tiene solicitudes de ese tipo, no devuelve nada, y necesitaría que devolviese lo mismo que antes: (ID del usuario, NULL, NULL).

¿Alguna idea? Gracias :)
  #2 (permalink)  
Antiguo 28/06/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: Left Join con condición que devuelva campos NULL si no hay coincidencia

Código MySQL:
Ver original
  1.      usuarios.id IDUser,
  2.      IFNULL(solicitudes.id, '') NroSolicitud,
  3.      IFNULL(solicitudes.tipo) TpoSolicitud
  4.      usuarios U
  5.      LEFT JOIN
  6.      solicitudes S ON U.id = S.solicitante
  7.     u.nick='XXX'
  8.     OR S.solicitante IS NULL
Si quieres el listado completo de usuarios:
Código MySQL:
Ver original
  1.      usuarios.id IDUser,
  2.      IFNULL(solicitudes.id, '') NroSolicitud,
  3.      IFNULL(solicitudes.tipo) TpoSolicitud
  4.      usuarios U
  5.      LEFT JOIN
  6.      solicitudes S ON U.id = S.solicitante
  7.     1
  8.     OR S.solicitante IS NULL
__________________
¿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 28/06/2012, 15:58
danihxh
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Left Join con condición que devuelva campos NULL si no hay coincidencia

Muchas gracias por contestar tan rápido! No era exactamente lo que quería, pero me ha sido de gran ayuda. Al final el campo tipo de solicitud sólo iba a tener dos valores, así que lo he puesto como BOOLEAN y me ha quedado algo así:

Código MySQL:
Ver original
  1.     usuarios.id,
  2.     usuarios.estado,
  3.     solicitudes.id,
  4.     .solicitudes.fecha,
  5.     IF((solicitudes.tipo OR solicitudes.tipo IS NULL)AND count(*)=1, NULL, FALSE) AS condicion
  6.     usuarios
  7.     LEFT JOIN
  8.     solicitudes ON usuarios.id=solicitudes.solicitante
  9.     nick='$this->user'
  10.     condicion IS NULL
  11.     OR condicion=FALSE
  12.  
  13.     usuarios.id,
  14.     usuarios.estado,
  15.     solicitudes.id,
  16.     .solicitudes.fecha,
  17.     IF((NOT solicitudes.tipo OR solicitudes.tipo IS NULL)AND count(*)=1, NULL, TRUE) AS condicion
  18.     usuarios
  19.     LEFT JOIN
  20.     solicitudes ON usuarios.id=solicitudes.solicitante
  21.     nick='$this->user'
  22.     condicion IS NULL
  23.     OR condicion=TRUE

De esta manera, obtengo "condicion"=NULL cuando el usuario no tiene solicitudes o tiene sólo una. En este último caso, cuando "solicitudes.tipo"==TRUE (primera query) o cuando "solicitudes.tipo"==FALSE (segunda query).

En cualquier otro caso: cuando "solicitudes.tipo"==FALSE (primera query), cuando "solicitudes.tipo"==TRUE(segunda query) o cuando el usuario ya tiene dos solicitudes (una de cada tipo), se obtiene TRUE en la primera queryy FALSE en la segunda.

Parece un poco engorroso, pero para lo que estoy haciendo me sirve, aunque estoy abierto a sugerencias. Espero que se entienda la explicación por si alguien lo consulta alguna vez :)

Última edición por danihxh; 28/06/2012 a las 16:03
  #4 (permalink)  
Antiguo 28/06/2012, 19:34
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: Left Join con condición que devuelva campos NULL si no hay coincidencia

Perdona que te lo diga, pero esta condición no tiene demasiado sentido, si la analizamos en detalle:
Código MySQL:
Ver original
  1. IF((solicitudes.tipo OR solicitudes.tipo IS NULL)AND count(*)=1, NULL, FALSE)
- En ese contexto, solicitudes.tipo dará TRUE con cualquier condición no nula.
- Será TRUE también, si solicitudes.tipo es NULL.
- COUNT(*) será siempre 1 si se filtra por un campo único, como "NICK" .
En definitiva, en principio, esa consulta siempre devolverá NULL... Salvo que tengas más de un registro por cad usuario.

La segunda consulta tienes esto:
Código MySQL:
Ver original
  1. IF((NOT solicitudes.tipo OR solicitudes.tipo IS NULL)AND count(*)=1, NULL, TRUE)
- La primera parte devolverá NULL si solicitudes.tipo contiene un cero o es NULL, o bien si solicitudes.tipo contiene un 1, o no es NULL y si además se filtra por un campo único, como "NICK" .
- Devolverá FALSE si solicitudes.tipo es 1 o NULL (algo contradictorio), y además COUNT() es mayor a 1 (difícil sin nick es unico)

Me parece que tienes que estás tratando de crear una consulta complicándote la vida... Un simple SUM() o COUNT() aplicado sobre esa columna creo que sería suficiente. Un valor igualo mayor a 1 sería toda la distinción que necesitas.
__________________
¿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; 29/06/2012 a las 03:39

Etiquetas: condición, join, left, null
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 22:22.