| |||
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 |
| ||||
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 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 |
| |||
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: gracias de nuevo UPDATE alumnos, notas SET notaPracticas = ( SELECT sum(nota) FROM notas WHERE tipoejer='practica' GROUP BY codigoAlumno ) WHERE alumnos.codigoAlumno = notas.codigoAlumno; |
| ||||
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 |
| |||
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 |
| ||||
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 |
| |||
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. |
| |||
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 |
| |||
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 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 |
Etiquetas: |