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

[SOLUCIONADO] Uso de clausula CASE

Estas en el tema de Uso de clausula CASE en el foro de Mysql en Foros del Web. Buenas a todos. Tengo un problema con una sentencia SQL que no soy capaz de resolver, a ver si podeis ayudarme. Tengo dos tablas: - ...
  #1 (permalink)  
Antiguo 10/12/2013, 09:09
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 12 años, 4 meses
Puntos: 1
Uso de clausula CASE

Buenas a todos. Tengo un problema con una sentencia SQL que no soy capaz de resolver, a ver si podeis ayudarme.

Tengo dos tablas:
- tbl_grupos. Atributos:
-- idgrupo
-- nombre_grupo
-- centro_grupo (clave foránea referenciando a idcentro de la tabla tbl_centro. Puede ser null).

- tbl_centros. Atributos:
-- idcentro
-- nombre_centro

Bien, quiero recuperar toda la información de los grupos pero en vez de centro_grupo, que es un int, que aparezca el nombre del grupo. Y el problema viene con los grupos que tienen centro_grupo = NULL (no pertenecen a ningún centro).

La siguiente sentencia funciona perfectamente:

SELECT g.idgrupo, g.nombre_grupo, c.nombre_centro
FROM tbl_grupos g
INNER JOIN tbl_centros c
WHERE c.idcentro = g.centro_grupo

Pero no muestra los grupos en los que centro_grupo = NULL. Para solucionarlo intento usar CASE pero no acabo de dar con la sentencia correcta. Partí de la siguiente sentencia, variando todo lo que se me ocurrió en la parte del CASE, pero no he conseguido que funcione.

SELECT g.idgrupo, g.nombre_grupo, g.centro_grupo =
CASE c.nombre
WHEN NULL THEN "-"
END
FROM tbl_grupos g
INNER JOIN tbl_centros c
WHERE c.idcentro = g.centro_grupo

Si pudierais ayudarme estaría muy agradecido.

Saludos.
  #2 (permalink)  
Antiguo 10/12/2013, 10:01
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: Uso de clausula CASE

!Qué ganas de complicarte la vida!
Código SQL:
Ver original
  1. SELECT g.idgrupo, g.nombre_grupo, IFNULL(c.nombre_centro, '-') nombre_centro
  2. FROM tbl_grupos g
  3. INNER JOIN tbl_centros c
  4. WHERE c.idcentro = g.centro_grupo

Posdata: CASE es una muy mala cláusula en MySQL para usarla en el SELECT. Para mí, es un "parche" innecesario usado principalmente por programadores.
__________________
¿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 10/12/2013, 12:44
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 12 años, 4 meses
Puntos: 1
Respuesta: Uso de clausula CASE

Gracias por responder.

He probado la sentencia que me dices pero siguen sin aparecer los grupos con centro_grupo a NULL.

Te dejo el export de ambas tablas por si lo necesitas.

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `tbl_grupos` (
  2.   `idgrupo` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `nombre_grupo` VARCHAR(50) COLLATE utf8_spanish_ci NOT NULL,
  4.   `tipo_grupo` tinyint(1) NOT NULL,
  5.   `centro_grupo` INT(11) DEFAULT NULL,
  6.   `tutor_grupo` INT(11) DEFAULT NULL,
  7.   `creador_grupo` INT(11) DEFAULT NULL,
  8.   `fecha_creacion` DATE DEFAULT NULL,
  9.   PRIMARY KEY (`idgrupo`),
  10.   KEY `tbl_grupos_fk_1` (`centro_grupo`),
  11.   KEY `tbl_grupos_fk_2` (`tutor_grupo`),
  12.   KEY `tbl_grupos_fk_3` (`creador_grupo`)
  13. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=12 ;


Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `tbl_centros` (
  2.   `idcentro` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `nombre` tinytext COLLATE utf8_spanish_ci NOT NULL,
  4.   `email` tinytext COLLATE utf8_spanish_ci NOT NULL,
  5.   `direccion` tinytext COLLATE utf8_spanish_ci NOT NULL,
  6.   `telefono` INT(11) NOT NULL,
  7.   `paginaweb` tinytext COLLATE utf8_spanish_ci,
  8.   `ruta_foto` VARCHAR(40) COLLATE utf8_spanish_ci NOT NULL,
  9.   `nombre_foto` VARCHAR(50) COLLATE utf8_spanish_ci NOT NULL,
  10.   `poblacion` tinytext CHARACTER SET utf8 COLLATE utf8_swedish_ci NOT NULL,
  11.   `provincia` tinyint(4) NOT NULL,
  12.   `director` INT(11) NOT NULL,
  13.   `administrador` INT(11) NOT NULL,
  14.   PRIMARY KEY (`idcentro`),
  15.   KEY `tbl_centros_fk_1` (`provincia`),
  16.   KEY `tbl_centros_fk_2` (`director`),
  17.   KEY `tbl_centros_fk_3` (`administrador`)
  18. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=9 ;
  #4 (permalink)  
Antiguo 10/12/2013, 12:47
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: Uso de clausula CASE

Cita:
Iniciado por DandyCC Ver Mensaje
Gracias por responder.

He probado la sentencia que me dices pero siguen sin aparecer los grupos con centro_grupo a NULL.

Porque el INNER JOIN no devolverá jamás casos donde no haya relación entre ambas tablas. Para eso debes usar LEFT JOIN:
Código SQL:
Ver original
  1. SELECT g.idgrupo, g.nombre_grupo, IFNULL(c.nombre_centro, '-') nombre_centro
  2. FROM tbl_grupos g LEFT JOIN tbl_centros c ON c.idcentro = g.centro_grupo
__________________
¿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 10/12/2013, 13:08
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 12 años, 4 meses
Puntos: 1
Respuesta: Uso de clausula CASE

Muchas gracias! Ya funciona. Tengo que ponerme más al día de sql que veo que estoy muy flojo.

Saludos y gracias!!

Etiquetas: case, clausula, join, null, select, sql, tabla
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 06:49.