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

problema con consulta facil

Estas en el tema de problema con consulta facil en el foro de Mysql en Foros del Web. Hola. Intento actualizar la columna notapracticas por la suma de las notas de tipoejer=practica (excluyendo la teoría) pero me da un error el SUM() update ...
  #1 (permalink)  
Antiguo 12/05/2013, 13:10
 
Fecha de Ingreso: marzo-2012
Mensajes: 45
Antigüedad: 12 años
Puntos: 0
problema con consulta facil



Hola.
Intento actualizar la columna notapracticas por la suma de las notas de tipoejer=practica (excluyendo la teoría) pero me da un error el SUM()

update ALUMNOS, NOTAS
set notapracticas = sum(nota)
where (alumnos.codigoAlumno=notas.codigoAlumno ) and (tipoejer='practica');


gracias de verdad
  #2 (permalink)  
Antiguo 12/05/2013, 14:53
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: problema con consulta facil


<saludos>
En efecto, eso es porque falta mejorar el query,
en cuyo caso lo que se debe hacer es lo siguiente
1. El campo notapracticas hacerlo igual a una subconsulta que vaya a la tabla de notas y sume las notas filtrando por las practicas Y por codigoAlumno (pues imagino que aparte de sumar las practicas se le debe sumar las practicas respectivas a cada alumno), y luego de la subconsulta, iria un where donde también se filtre por codigoAlumno, pues solo se debe afectar cierto codigoAlumno

2. Ya sea por base de datos en un trigger, o por un programa, o en el peor de los casos manualmente, ejecutar el update por cada alumno, pues de no hacerse de este modo, todos los alumnos tendrían la misma sumatoria de notas de práctica

Por último, una idea del query sería de este modo

Código MySQL:
Ver original
  1. update alumnos set notaPracticas = (
  2. select sum(nota) from notas
  3. where tipoejer='practica'
  4. and codigoAlumno = 1
  5. )
  6. where codigoAlumno = 1

Suerte con eso!!

</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #3 (permalink)  
Antiguo 12/05/2013, 15:30
 
Fecha de Ingreso: marzo-2012
Mensajes: 45
Antigüedad: 12 años
Puntos: 0
Respuesta: problema con consulta facil

Muchas gracias por tu respuesta.

¿no queda mas remedio que hacerlo por cada código de alumno?? ¿¿y si hubiera 1 millón de filas?

¿porqué no funcionaría esto?
Cita:
UPDATE alumnos, notas SET notaPracticas = (

SELECT sum(nota) FROM notas
WHERE tipoejer='practica'
GROUP BY codigoAlumno
)

WHERE alumnos.codigoAlumno = notas.codigoAlumno;
gracias de nuevo
  #4 (permalink)  
Antiguo 12/05/2013, 17:29
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: problema con consulta facil

<saludos>
Bueno, es porque al ser una subconsulta (refiriendome al select sum()) , trae más de 1 registro.
Por esto mismo lo mejor sería hacerlo por un programa.
o mejor aún si lo haces por base de datos, sería hacer un trigger que se dispare cada vez que se le de a un alumno una nota y que sea de tipo práctica, y que se encargue de actualizar la tabla de alumnos, aunque la verdad me parece que lo mejor es que no sea guardado esa suma en base de datos, sino que siempre se actualice por consulta.
Me explico, por ej si quisiera sacar un reporte pasado un mes del total de notas por alumno, y si me voy a la columna notaPracticas, dicho reporte no contendría las notas más recientes si el calculo que actualmente haces para actualizar el campo notaPracticas no se ha ejecutado.
Y por ende, antes de hacer el SELECT del reporte necesariamente tendría que ejecutar el UPDATE para todos los alumnos, en cuyo caso me parece mucho mejor hacer el SELECT directamente sobre la tabla de las notas haciendo los filtros que se usan actualmente para el UPDATE.
La forma en que estás planteando el UPDATE serviría si el motor de base de datos pudiese hacer un cruce como el que tu propones, pero pues hasta la fecha no he visto que un motor pueda hacer algo tan elocuente.
</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Última edición por gnzsoloyo; 12/05/2013 a las 17:37 Razón: saltos de línea hacen poco legible el texto
  #5 (permalink)  
Antiguo 13/05/2013, 13:55
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: problema con consulta facil

No lo he probado, pero algo así debería funcionar. Lleva, claro subconsulta. No obstante, lee con atención los consejos de mortiprogramador
Código MySQL:
Ver original
  1. UPDATE alumnos a
  2.     (SELECT
  3.        codigoAlumno,
  4.        SUM(nota) sumanota
  5.       FROM notas
  6.     WHERE tipoEjer='practica'
  7.      GROUP BY codigoAlumno)t1
  8. ON a.codigoAlumno = t1.codigoAlumno
  9.      SET a.notaPracticas = t1.sumanota
  #6 (permalink)  
Antiguo 13/05/2013, 19:14
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: problema con consulta facil

Joer Jurena, como dicen en tu tierra, eres el put@ amo!
en efecto, funciona correctamente (por lo menos en mis pruebas que son de pocos datos, pero pues debería funcionar, aunque habrá que ver como se porta con el millón de registros que refiere javiinet, tal vez tome su tiempo pero debería funcionar
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #7 (permalink)  
Antiguo 14/05/2013, 03:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: problema con consulta facil

mortiprogramador,
en realidad, yo estoy contigo en que estas cosas con triggers mucho mejor. Actualizas una vez con una consulta como esa, si quieres, y luego añades a partir de ahí el trigger y cada vez que se añada una la suma. Así evitas estas actualizaciones generales. Añades el dato mediante el trigger y luego consultas directamente sobre esa tabla, sin necesidad de más. Yo también lo prefiero, y por eso le aconsejé que leyera tu post, porque ahí está la solución de futuro.
  #8 (permalink)  
Antiguo 15/05/2013, 01:54
 
Fecha de Ingreso: marzo-2012
Mensajes: 45
Antigüedad: 12 años
Puntos: 0
Respuesta: problema con consulta facil

Fantástico !!.
Muchas gracias.

jurena, si no es mucho pedir me podrías explicar la solución ??

estudiando la sintaxis de UPDATE viene :

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]


y aqui no se donde encaja tu INNER JOIN con subselect

Muchas gracias de nuevo
  #9 (permalink)  
Antiguo 15/05/2013, 03: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: 16 años, 4 meses
Puntos: 2658
Respuesta: problema con consulta facil

Pues sigue leyendo el manual... Un poco más abajo menciona el uso d JOINs...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 15/05/2013, 07:56
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: problema con consulta facil

Primero mira el centro de la cebolla, me refiero a la consulta por la que me traigo el codigo de cada alumno y la suma de notas de todos los ejercicios cuyo tipoEjer sea práctica, agrupado todo ello por código alumno. Esa es la subconsulta a la que mediante t1, un alias, le doy nombre. Es como si tuviese una tabla virtual
Código MySQL:
Ver original
  1.        codigoAlumno,
  2.        SUM(nota) sumanota
  3.       FROM notas
  4.     WHERE tipoEjer='practica'
  5.      GROUP BY codigoAlumno

Ahora puedo relacionar los datos de ese select con los del update, relacionando mediante INNER JOIN la tabla con ese select usando codigoAlumno para establecer la relación, claro. Y cargo el valor de t1.sumanota en notaPracticas

Código MySQL:
Ver original
  1. UPDATE alumnos a
  2.     ...
  3. ON a.codigoAlumno = t1.codigoAlumno
  4.      SET a.notaPracticas = t1.sumanota
  #11 (permalink)  
Antiguo 15/05/2013, 13:25
 
Fecha de Ingreso: marzo-2012
Mensajes: 45
Antigüedad: 12 años
Puntos: 0
Respuesta: problema con consulta facil

ok
gracias


Etiquetas: facil
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 09:26.