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

[SOLUCIONADO] Utilizar count dentro de un alter table

Estas en el tema de Utilizar count dentro de un alter table en el foro de Mysql en Foros del Web. Hola de nuevo, Tengo que añadir a una columna a una tabla ya creada. club (codClub, nomClub,numSoc) Me piden que cree una columna que contega: ...
  #1 (permalink)  
Antiguo 23/11/2013, 12:14
 
Fecha de Ingreso: noviembre-2013
Ubicación: Barcelona
Mensajes: 33
Antigüedad: 10 años, 4 meses
Puntos: 0
Utilizar count dentro de un alter table

Hola de nuevo,

Tengo que añadir a una columna a una tabla ya creada.

club (codClub, nomClub,numSoc)

Me piden que cree una columna que contega:

El numero de empleados que formen parte del club, dichos datos salen de la entidad "persona"

persona(codP,nombre,apellido, direccion, telefono,codClub) on codClub REF. club

En el atributo codClub aparecen el codigo de club de cada persona. (empleados del club)

Si realizo
Código:
select count(codClub) from persona group by codClub;
funciona bien en la entidad persona.

Sin embargo no consigo hacerlo desde la tabla club

Código:
alter table club
add empleats count(codClub) from persona group by codClub) 
smallint(3) 
default 0 
after nomclub;
La parte en negrita es la que me falla. Estoy buscando en internet y no consigo dar con un buen ejemplo.

Alguien podria ayudarme?

Muchas gracias,
Jose Luis,
  #2 (permalink)  
Antiguo 24/11/2013, 08:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años
Puntos: 574
Respuesta: Utilizar count dentro de un alter table

Tienes dos errores de planteamiento

1.- En Alter table solo debes crear el campo, sin datos. Despues puedes hacer un UPDATE para cargar los datos....

2.- Ese campo que te piden seria un campo calculado, luego es de por si un error de diseño.

Código MySQL:
Ver original
  1. SELECT c.codClub, c.nomClub,c.numSoc,sbc.empleats
  2. FROM club c INNER JOIN
  3.     (select p.codClub,count(codClub) empleats from persona p group by p.codClub) Sbc
  4.      ON c.codClub=Sbc.codClub;

Esto te da lo que buscas sin peligro de que en algun momento el numero de personas y el de empleados sean incoherentes....

Si "numSoc" es lo que me imagino, numero de socios, deberías aplicar la misma solución...

Va te lo doy hecho

Código MySQL:
Ver original
  1. CREATE VIEW infoClub AS
  2. SELECT c.codClub, c.nomClub,sbcSocis.numSoc,sbcEmpleats.numTreb
  3. FROM club c
  4.    INNER JOIN (select p.codClub,
  5.                                  count(codClub) numTreb
  6.                        from persona p group by p.codClub) sbcEmpleats
  7.      ON c.codClub=sbcEmpleats.codClub
  8.    INNER JOIN (select s.codClub,
  9.                                  count(s.codClub) numSoc
  10.                        from socis s group by s.codClub) sbcSocis
  11.      ON c.codClub=sbcSocis.codClub;

Eso crea una vista "infoClub" que te da los datos de los clubs... siempre actualizados... si das de alta una persona nueva o un socio nuevo no deberas preocuparte de actualizar nada para que salga el numero correcto.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 25/11/2013, 15:37
 
Fecha de Ingreso: noviembre-2013
Ubicación: Barcelona
Mensajes: 33
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Utilizar count dentro de un alter table

hola quimfv,

Lo que se me plantea esto:

Añadir a una columna a una tabla (club) que contega:

El numero de empleados que formen parte del club, dichos datos salen de la entidad "persona"

club (codClub, nomClub,numSoc)

persona(codP,nombre,apellido, direccion, telefono,codClub) on codClub REF. club

No puedo cambiar ni la forma ni el planteamiento.

Yo me supongo que tengo que crear la columna con un count(codClub) en la tabla personas y el numero de empleados por equipo añadirlo a la tabla. Llevo dos dias intentandolo y no encuentro la manera.

Muchas gracias,
  #4 (permalink)  
Antiguo 25/11/2013, 15:59
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: Utilizar count dentro de un alter table

Cita:
Yo me supongo que tengo que crear la columna con un count(codClub) en la tabla personas y el numero de empleados por equipo añadirlo a la tabla. Llevo dos dias intentandolo y no encuentro la manera.
Estás interpretando completamente mal la consigna de lo que debes hacer.
Lo que debes hacer es agregar una columna en donde almacenarás el total de empleados por equipo. Pero eso no significa que debas agregar la columna usando COUNT(). Eso es simple y sencillamente IMPOSIBLE, y quien te haya puesto ese requerimiento de ese modo, o lo escribió mal o es un completo ignorante de SQL y bases de Datos.
Los pasos son simples:
1) Modificas la tabla para agregar un campo numérico.
2) Actualizas el contenido ese campo con un UPDATE con JOIN, en el que se use el SUM correspondiente.

Pero te insisto: No se puede meter un COUNT en un ALTER TABLE. No existe DBM que te permita hacer eso.

Todo esto sin dejar de lado lo que ya te dijeron: No se deben crear campos calculados en una tabla. Eso es un error de diseño básico, y sólo tendría sentido si se trata de un trabajo escolar. En el mundo real no se hace, y en las cursadas de Bases de Datos en la facultad, poner un campo calculado en una tabla implicaría (al menos en donde yo estudié) reprobar la materia sin más trámite, ni necesidad de seguir leyendo el examen.
Te lo aseguro. Lo he visto pasar.
__________________
¿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 30/11/2013, 07:47
 
Fecha de Ingreso: noviembre-2013
Ubicación: Barcelona
Mensajes: 33
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Utilizar count dentro de un alter table

Hola gnzsoloyo,

Perdonad el retraso en contestar. Tienes razón tengo creada la columna en la tabla,
esto es lo que he intentado. He estado mirando en la ayuda de referencia de mysqll y en google, he utilizado varias formas, esta es la que más se acerca:

Código MySQL:
Ver original
  1. update club c
  2. right join(select count(p.codClub) from persona p group by p.codClub) p
  3. on p.codClub=c.codClub
  4. set c.empleats=p.codClub;

Sin embargo me da un error de Unknown column 'Persona.codClub' in 'on clausse'

Última edición por gnzsoloyo; 30/11/2013 a las 09:01
  #6 (permalink)  
Antiguo 30/11/2013, 09:10
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: Utilizar count dentro de un alter table

Annduviste cerca, pero parece que no entiendes la idea del RIGHT JOIN, sobre todo porque no es la cláusula adecuada.
Entendamos que:
INNER JOIN juta dos tablas por medio de una relación obligatoria, es decir, devuelve sólo los registros donde existen efectivamente valores relacionados.
LEFT JOIN devuelve todo lo que está en la primera tabla, se cumpla o no la relación indicada, y donde no se cumple, en la segunda devuelve nulos.
RIGHT JOIN es su complementario, por lo que devuelve TODOS los valores de la SEGUNDA TABLA, cumplan o no con la relación. Pero eso implica que en la primera se devuelven NULL donde la relación no se cumple.

En base a eso, te imaginarás que estás intentando asignar valores existentes en la segunda tabla, a relaciones inexistentes en la primera.... lo que es imposible.

Fuera de eso, estás solapando alias entre la consulta base y la subconsulta, lo que llevará a MySQL a generar errores de parseo imposibles de resolver o generará asignaciones incorrectas.

De todos mdos, como dije, estás cerca. Yo lo probarías así:

Código MySQL:
Ver original
  1. UPDATE  c
  2. FROM club c LEFT JOIN (SELECT COUNT (p.codClub) cant, codClub FROM persona GROUP BY codClub) p ON c.codClub = p.codClub
  3. SET c.empleats = IFNULL(p.codClub, 0);

De todos modos, como creo que ya te dijeron, es una muy mala práctica crear campos calculados en una base de datos relacional. Si los pusieras como solución de un examen de BBDD, te reprobarían sin más trámite.
Nunca se ponen porque son antiperformáticos a todos los niveles, y porque pueden generar información sucia o inconsistente.
¿Por qué?
Porque requieren constante actualización por procesos ad-hoc, lo que termina conspirando contra las necesidades de la aplicación. Y además no se necesitan, por cuanto la misma consulta que obtiene los datos puede hacer los cálculos necesarios on the fly, con lo que siempre tienes la información actualizada.
Además, es mejor mantener información que pueda ser trazable históricamente, y un campo calculado no sirve para eso.
En definitiva, se transforman en datos-basura. En BBDD se los considera "vicios de 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)
  #7 (permalink)  
Antiguo 30/11/2013, 10:04
 
Fecha de Ingreso: noviembre-2013
Ubicación: Barcelona
Mensajes: 33
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Utilizar count dentro de un alter table

Hola gnzsoloyo,

No se que decirte, llevo años en foros y nunca he visto en ninguno alguien que por suerte conteste y diga los porques. Es de agradecer encontrar a alguien como tu, por lo que muchisimas gracias.

En cuanto a lo de los campos calculados, por desgracia no puedo hacer nada, son ejercicios que me mandan y no puedo modificarlos. Hace años que hize mysql, aunque no me acuerdo de mucho, cuando creo alguna base de datos no me complico mucho la vida. Pero como digo son ejercicios de los que me tengo que examinar en Enero y no me queda mas que hacerlos y sobre todo, y por ellos te doy las gracias, entenderlos.

Muchas gracias de nuevo,
Jose Luis,

Etiquetas: count, select, tabla, table
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 13:50.