Foros del Web » Programando para Internet » PHP »

PHP OO POSICION de un elemento dentro de un conjunto de datos

Estas en el tema de POSICION de un elemento dentro de un conjunto de datos en el foro de PHP en Foros del Web. En muchas ocasiones he visitado este foro y gracias a sus aportes he aprendido mucho. Es por esto que me atrevo a consultarles. Antes que ...
  #1 (permalink)  
Antiguo 27/11/2014, 11:08
Avatar de nemadi  
Fecha de Ingreso: noviembre-2014
Mensajes: 7
Antigüedad: 9 años, 4 meses
Puntos: 0
POSICION de un elemento dentro de un conjunto de datos

En muchas ocasiones he visitado este foro y gracias a sus aportes he aprendido mucho. Es por esto que me atrevo a consultarles. Antes que nada advierto que soy nueva y estoy apenas aprendiendo a programar. Mi problema es el siguiente:
Estoy haciendo un sistema de calificaciones para diferentes estudiantes y tengo varias tablas alojadas en una base de datos con las calificaciones correspondientes al año escolar.
Deseo hacer una boleta de calificaciones para cada estudiante con sus diferentes materias y promedio. Pero dentro de este boletín necesito agregar la posición del estudiante según su promedio. Lo que se me ocurrió fue hacer una consulta a mi base de datos ordenando por promedio, pero necesito que los estudiantes estén ordenados no por su promedio, sino por su cédula de identificación (que está alojada en la bd), y además obtener su posición en promedio por sección, por año y por todo el plantel.
Tengo una tabla por cada seccion (1ºA, 1ºB, 1ºC...)
Intenté usar la función array_search pero según leí no es útil para un array asociativo.
El boletin de calificaciones es una tabla dentro de un do - while para que se repita con los datos de cada estudiante.
¿Cómo puedo obtener la posición por promedio del estudiante?? Es decir si tiene el promedio más alto sería el Nº1, o el Nº 20 o el 100 según sea el caso.
Espero haber planteado correctamente mi duda…
  #2 (permalink)  
Antiguo 27/11/2014, 11:29
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: POSICION de un elemento dentro de un conjunto de datos

Bienvenida al foro.

Esto posiblemente se pueda resolver directamente en la base de datos.

Por favor,
1) Indica que tablas tienes en la base de datos y que columnas tiene cada una (solo las involucradas en este problema)
2) Muestra el código php que tengas actualmente para armar la boleta de calificaciones.

Viendo esas dos cosas te podremos orientar.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 27/11/2014, 14:29
Avatar de nemadi  
Fecha de Ingreso: noviembre-2014
Mensajes: 7
Antigüedad: 9 años, 4 meses
Puntos: 0
tablas y consultas

TABLAS:
resumen1a, 4 columnas por cada materia correspondientes a las calificaciones parciales y al promedio anual de la materia. En total 44 columnas de las materias, todas integer , una columna al final para el promedio total del estudiante tipo float y las dos primeras columnas para la cedula del alumno y para su nombre.

CREATE TABLE IF NOT EXISTS `resumen1a` (
`cedula` varchar(15) COLLATE utf8_spanish_ci NOT NULL,
`nombre` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
`castellano1` int(2) DEFAULT NULL,
`castellano2` int(2) DEFAULT NULL,
`castellano3` int(2) DEFAULT NULL,
`castellanodef` int(2) DEFAULT NULL,
`ingles1` int(2) DEFAULT NULL,
`ingles2` int(2) DEFAULT NULL,
`ingles3` int(2) DEFAULT NULL,
`inglesdef` int(2) DEFAULT NULL,
`matematica1` int(2) DEFAULT NULL,
`matematica2` int(2) DEFAULT NULL,
`matematica3` int(2) DEFAULT NULL,
`matematicadef` int(2) DEFAULT NULL,

`informatica1` int(2) DEFAULT NULL,
`informatica2` int(2) DEFAULT NULL,
`informatica3` int(2) DEFAULT NULL,
`informaticadef` int(2) DEFAULT NULL,
`total` float DEFAULT NULL,
UNIQUE KEY `cedula` (`cedula`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

La tabla de inasistencias es casi igual, 1 columna para la cedula del estudiante, otra para el nombre, y 33 columnas correspondientes a las materias, 3 columnas por materia (cada columna para las asistencias del lapso1, lapso2 lapso 3).

CONSULTAS:

mysql_select_db($database_conexion2, $conexion2);
$query_notas = "SELECT * FROM resumen1a ORDER BY cedula ASC";
$notas = mysql_query($query_notas, $conexion2) or die(mysql_error());
$row_notas = mysql_fetch_assoc($notas);
$totalRows_notas = mysql_num_rows($notas);

mysql_select_db($database_conexion2, $conexion2);
$query_inasistencias = "SELECT * FROM inasistencias1a ORDER BY cedula ASC";
$inasistencias = mysql_query($query_inasistencias, $conexion2) or die(mysql_error());
$row_inasistencias = mysql_fetch_assoc($inasistencias);
$totalRows_inasistencias = mysql_num_rows($inasistencias);
  #4 (permalink)  
Antiguo 27/11/2014, 14:30
Avatar de nemadi  
Fecha de Ingreso: noviembre-2014
Mensajes: 7
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: POSICION de un elemento dentro de un conjunto de datos

Y ESTE ES LA TABLA DE LA BOLETA DE CALIFICACIONES:

<?php do { ?>
<p>BOLET&Iacute;N DE INFORMACI&Oacute;N ACAD&Eacute;MICA</p>
<p>PERIODO ESCOLAR --</p>
<table width="900" border="1" cellspacing="0">
<tr>
<td colspan="2">Cédula de Ident.</td>
<td><?php echo $row_notas['cedula']; ?></td>
<td>Alumno:</td>
<td colspan="5"><?php echo $row_notas['nombre']; ?></td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">Especialidad:</td>
<td>EDUC. B&Aacute;SICA</td>
<td>Menci&oacute;n:</td>
<td colspan="2">B&Aacute;SICA</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">Año o Grado:</td>
<td>PRIMER A&Ntilde;O</td>
<td>Secci&oacute;n:</td>
<td>A</td>
<td>&nbsp;</td>
<td>Lapso:</td>
<td colspan="2">PRIMERO</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">Representante:</td>
<td colspan="8"><?php echo $row_datos['nombrerepre']; ?></td>
</tr>
<tr>
<td colspan="2">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2" rowspan="2">Asignaturas</td>
<td colspan="2">1ER. LAPSO</td>
<td colspan="2">2DO. LAPSO.</td>
<td colspan="2">3ER. LAPSO</td>
<td colspan="2">DEFINITIVA</td>
</tr>
<tr>
<td>NOTAS</td>
<td>INASIS</td>
<td>NOTAS</td>
<td>INASIS.</td>
<td>NOTAS</td>
<td>INASIS.</td>
<td>NOTAS</td>
<td>INASIS.</td>
</tr>
<tr>
<td colspan="2">CASTELLANO Y LIT.</td>
<td><?php echo $row_notas['castellano1']; ?></td>
<td><?php echo $row_inasistencias['cas1']; ?></td>
<td><?php echo $row_notas['castellano2']; ?></td>
<td><?php echo $row_inasistencias['cas2']; ?></td>
<td><?php echo $row_notas['castellano3']; ?></td>
<td><?php echo $row_inasistencias['cas3']; ?></td>
<td><?php
$counter=0;
$notascas=array($row_notas['castellano1'],$row_notas['castellano2'],$row_notas['castellano3']);
foreach($notascas as $value) { if($value !='') $counter++; }
if ($counter==0){}
else {
$promedio_cas=round(array_sum($notascas)/$counter);
echo $promedio_cas;}
?></td>
<td><?php $incas=($row_inasistencias['cas1']+$row_inasistencias['cas2']+$row_inasistencias['cas3']); echo $incas;?></td>
</tr>
<tr>
<td colspan="2">INGL&Eacute;S</td>
<td></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">MATEM&Aacute;TICA</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">ESTUDIO DE LA NAT.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">HIST. DE VENEZUELA</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">EDUC. FAM. Y CIUDADANA</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">GEOGRAFIA GENERAL</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">EDUCACI&Oacute;N ART&Iacute;STICA</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">EDUC. F&Iacute;SICA Y DEP.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">NOC. BAS. DE OFICINA *</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">INFORM&Aacute;TICA</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">EDUC. P/EL TRABAJO</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Posición en el curso:</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>Por año:</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>En el Plantel:</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Promedio del alumno:</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td colspan="2">Promedio del curso:</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>posicion</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
<?php } while ($row_notas = mysql_fetch_assoc($notas)); ?>


Uso Xampp 1.8.3
PHP: 5.5.11
  #5 (permalink)  
Antiguo 27/11/2014, 14:33
Avatar de nemadi  
Fecha de Ingreso: noviembre-2014
Mensajes: 7
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: POSICION de un elemento dentro de un conjunto de datos

Lo que deseo saber es como sacar al posición del estudiante según su promedio. Este boletín es solo para presentar los datos, ya todo está en las tablas de la bd. Tengo una tabla por cada año con sus respectivas calificaciones y promedios. Pero no tengo idea de cómo obtener la posición. Es lo que hace la función "jerarquia" en excel o "rank", pero no sé como hacerlo en php. Gracias por su tiempo...

Última edición por nemadi; 27/11/2014 a las 14:53
  #6 (permalink)  
Antiguo 01/12/2014, 10:13
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: POSICION de un elemento dentro de un conjunto de datos

Ehhhh......

A ver, vamos por partes.

1) En el editor, arriba, hay una opcion que dice Highlight, se usa para poner codigo, por favor, cuando publiques codigo de culquier lenguaje, usa esa opcion.

2) ¿Tablas con 44 columnas? y si mañana se agrega una materia mas, ¿Agregas otra columna a la tabla? eso esta mal. En si esta mal el modelo de datos, por lo tanto todo lo que venga después de eso también estará mal ya que acarrea un error de mal diseño.

Lo que tienes que hacer como punto de partida, es rearmar la base de datos.

La idea es que separes cada cosa en una tabla diferente.

Las materias:
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `materias` (
  2.   `nombre` char(100) NOT NULL,
  3.   PRIMARY KEY (`codigo`)
  4.  
  5. --
  6. -- Volcado de datos para la tabla `materias`
  7. --
  8.  
  9. INSERT INTO `materias` (`codigo`, `nombre`) VALUES
  10. (1, 'Castellano'),
  11. (2, 'Ingles'),
  12. (3, 'Matematica'),
  13. (4, 'Informatica');

Los cursos:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `cursos` (
  2.   `nombre` char(100) NOT NULL,
  3.   PRIMARY KEY (`codigo`)
  4.  
  5. --
  6. -- Volcado de datos para la tabla `cursos`
  7. --
  8.  
  9. INSERT INTO `cursos` (`codigo`, `nombre`) VALUES
  10. (1, '1a'),
  11. (2, '1b'),
  12. (3, '2a'),
  13. (4, '2b');

Los alumnos pertenecen solo a un curso, por lo que hay que relacionarlos:
Código MySQL:
Ver original
  1. --
  2. -- Estructura de tabla para la tabla `alumnos`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `alumnos` (
  6.   `nombre` char(100) NOT NULL,
  7.   `curso` int(10) unsigned DEFAULT NULL,
  8.   PRIMARY KEY (`cedula`),
  9.   KEY `curso` (`curso`)
  10.  
  11. --
  12. -- Volcado de datos para la tabla `alumnos`
  13. --
  14.  
  15. INSERT INTO `alumnos` (`cedula`, `nombre`, `curso`) VALUES
  16. (1, 'French', 1),
  17. (2, 'Beruti', 1),
  18. (3, 'Vicente Lopez', 1),
  19. (4, 'Mitre', 3),
  20. (5, 'Belgrano', 3),
  21. (6, 'San Martin', 3);
  22.  
  23. --
  24. -- Restricciones para tablas volcadas
  25. --
  26.  
  27. --
  28. -- Filtros para la tabla `alumnos`
  29. --
  30. ALTER TABLE `alumnos`
  31.   ADD CONSTRAINT `alumnos_ibfk_1` FOREIGN KEY (`curso`) REFERENCES `cursos` (`codigo`) ON DELETE SET NULL ON UPDATE CASCADE;

Las materias pertenecen a 1 o mas cursos, por ejemplo, todos los 1º tendrán las mismas materias (quizá con otros profesores, pero eso es otro tema aparte), por lo que hay que relacionar las materias con los cursos:

Código MySQL:
Ver original
  1. --
  2. -- Estructura de tabla para la tabla `materiasxcurso`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `materiasxcurso` (
  6.   `curso` int(10) unsigned NOT NULL,
  7.   `materia` int(10) unsigned NOT NULL,
  8.   PRIMARY KEY (`curso`,`materia`),
  9.   KEY `materia` (`materia`)
  10.  
  11. --
  12. -- Volcado de datos para la tabla `materiasxcurso`
  13. --
  14.  
  15. INSERT INTO `materiasxcurso` (`curso`, `materia`) VALUES
  16. (1, 1),
  17. (2, 1),
  18. (1, 2),
  19. (2, 2),
  20. (3, 3),
  21. (4, 3),
  22. (3, 4),
  23. (4, 4);
  24.  
  25. --
  26. -- Restricciones para tablas volcadas
  27. --
  28.  
  29. --
  30. -- Filtros para la tabla `materiasxcurso`
  31. --
  32. ALTER TABLE `materiasxcurso`
  33.   ADD CONSTRAINT `materiasxcurso_ibfk_2` FOREIGN KEY (`materia`) REFERENCES `materias` (`codigo`) ON DELETE CASCADE ON UPDATE CASCADE,
  34.   ADD CONSTRAINT `materiasxcurso_ibfk_1` FOREIGN KEY (`curso`) REFERENCES `cursos` (`codigo`) ON DELETE CASCADE ON UPDATE CASCADE;

Y finalmente, cada alumno debe tener un registro de que materias curso y que notas parciales se saco:
Código MySQL:
Ver original
  1. --
  2. -- Estructura de tabla para la tabla `materiasxalumno`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `materiasxalumno` (
  6.   `alumno` int(10) unsigned NOT NULL,
  7.   `materia` int(10) unsigned NOT NULL,
  8.   `parcial1` tinyint(4) DEFAULT NULL,
  9.   `parcial2` tinyint(4) DEFAULT NULL,
  10.   `parcial3` tinyint(4) DEFAULT NULL,
  11.   PRIMARY KEY (`alumno`,`materia`),
  12.   KEY `materia` (`materia`)
  13.  
  14. --
  15. -- Volcado de datos para la tabla `materiasxalumno`
  16. --
  17.  
  18. INSERT INTO `materiasxalumno` (`alumno`, `materia`, `parcial1`, `parcial2`, `parcial3`) VALUES
  19. (1, 1, 10, 8, 9),
  20. (1, 2, 7, 8, 9),
  21. (2, 1, 4, 2, 6),
  22. (2, 2, 8, 7, 7),
  23. (3, 1, 2, 8, 9),
  24. (3, 2, 7, 7, 7),
  25. (4, 1, 7, 8, 7),
  26. (4, 2, 6, 8, 7),
  27. (4, 3, 5, 8, 8),
  28. (4, 4, 8, 7, 9),
  29. (5, 1, 7, 7, 7),
  30. (5, 2, 7, 7, 7),
  31. (5, 3, 4, 6, 6),
  32. (5, 4, 6, 8, 7),
  33. (6, 1, 6, 8, 8),
  34. (6, 2, 9, 6, 7),
  35. (6, 3, 1, 4, 6),
  36. (6, 4, 9, 8, 9);
  37.  
  38. --
  39. -- Restricciones para tablas volcadas
  40. --
  41.  
  42. --
  43. -- Filtros para la tabla `materiasxalumno`
  44. --
  45. ALTER TABLE `materiasxalumno`
  46.   ADD CONSTRAINT `materiasxalumno_ibfk_2` FOREIGN KEY (`materia`) REFERENCES `materias` (`codigo`) ON DELETE CASCADE ON UPDATE CASCADE,
  47.   ADD CONSTRAINT `materiasxalumno_ibfk_1` FOREIGN KEY (`alumno`) REFERENCES `alumnos` (`cedula`) ON DELETE CASCADE ON UPDATE CASCADE;

Ahora bien, con esa estructura, si lo que quieres es saber el promedio que un alumno tiene en una materia particular puedes hacer:
Código MySQL:
Ver original
  1.   a.nombre,
  2.   m.nombre,
  3.   (
  4.     (
  5.       IFNULL(ma.parcial1,0)+
  6.       IFNULL(ma.parcial2,0)+
  7.       IFNULL(ma.parcial3,0)
  8.     )
  9.     /
  10.     (
  11.       IF(ma.parcial1 IS NULL, 0, 1)+
  12.       IF(ma.parcial2 IS NULL, 0, 1)+
  13.       IF(ma.parcial3 IS NULL, 0, 1)
  14.     )
  15.   ) promedio
  16. FROM materiasxalumno ma
  17.   INNER JOIN alumnos a ON ma.alumno = a.cedula
  18.   INNER JOIN materias m ON ma.materia = m.codigo
  19.   (
  20.     ma.parcial1 IS NOT NULL OR
  21.     ma.parcial2 IS NOT NULL OR
  22.     ma.parcial3 IS NOT NULL
  23.   )
  24.   AND ma.alumno = 1
  25.   AND ma.materia = 1

Con eso sabes que promedio tiene un alumno en una materia.

Ahora si quieres saber el promedio de un alumno en todas las materias que curso, puedes hacer:
Código MySQL:
Ver original
  1.   a.nombre,
  2.   COUNT(ma.materia) materias_cursadas,  
  3.   AVG(
  4.     (
  5.       IFNULL(ma.parcial1,0)+
  6.       IFNULL(ma.parcial2,0)+
  7.       IFNULL(ma.parcial3,0)
  8.     )
  9.     /
  10.     (
  11.       IF(ma.parcial1 IS NULL, 0, 1)+
  12.       IF(ma.parcial2 IS NULL, 0, 1)+
  13.       IF(ma.parcial3 IS NULL, 0, 1)
  14.     )
  15.    ) promedio
  16. FROM materiasxalumno ma
  17.   INNER JOIN alumnos a ON ma.alumno = a.cedula
  18.   INNER JOIN materias m ON ma.materia = m.codigo
  19.   (
  20.     ma.parcial1 IS NOT NULL OR
  21.     ma.parcial2 IS NOT NULL OR
  22.     ma.parcial3 IS NOT NULL
  23.   )
  24.   AND ma.alumno = 1
  25. GROUP BY ma.alumno

Si quieres hacer un ranking puedes hacer:
Código MySQL:
Ver original
  1.   (@rownum:=@rownum+1) posicion,
  2.   ma.alumno,
  3.   a.nombre,
  4.   COUNT(ma.materia) materias_cursadas,  
  5.   AVG(
  6.     (
  7.       IFNULL(ma.parcial1,0)+
  8.       IFNULL(ma.parcial2,0)+
  9.       IFNULL(ma.parcial3,0)
  10.     )
  11.     /
  12.     (
  13.       IF(ma.parcial1 IS NULL, 0, 1)+
  14.       IF(ma.parcial2 IS NULL, 0, 1)+
  15.       IF(ma.parcial3 IS NULL, 0, 1)
  16.     )
  17.    ) promedio
  18.   (SELECT @rownum:=0) pos,
  19.   materiasxalumno ma
  20.   INNER JOIN alumnos a ON ma.alumno = a.cedula
  21.   INNER JOIN materias m ON ma.materia = m.codigo
  22.   (
  23.     ma.parcial1 IS NOT NULL OR
  24.     ma.parcial2 IS NOT NULL OR
  25.     ma.parcial3 IS NOT NULL
  26.   )
  27. GROUP BY ma.alumno
  28. ORDER BY promedio DESC

Y si quieres saber, en particular, que posicion de ese ranking ocupa un alumno, puedes hacer:
Código MySQL:
Ver original
  1. SELECT posicion
  2. (
  3.   (@rownum:=@rownum+1) posicion,
  4.   ma.alumno,
  5.   a.nombre,
  6.   COUNT(ma.materia) materias_cursadas,  
  7.   AVG(
  8.     (
  9.       IFNULL(ma.parcial1,0)+
  10.       IFNULL(ma.parcial2,0)+
  11.       IFNULL(ma.parcial3,0)
  12.     )
  13.     /
  14.     (
  15.       IF(ma.parcial1 IS NULL, 0, 1)+
  16.       IF(ma.parcial2 IS NULL, 0, 1)+
  17.       IF(ma.parcial3 IS NULL, 0, 1)
  18.     )
  19.    ) promedio
  20.   (SELECT @rownum:=0) pos,
  21.   materiasxalumno ma
  22.   INNER JOIN alumnos a ON ma.alumno = a.cedula
  23.   INNER JOIN materias m ON ma.materia = m.codigo
  24.   (
  25.     ma.parcial1 IS NOT NULL OR
  26.     ma.parcial2 IS NOT NULL OR
  27.     ma.parcial3 IS NOT NULL
  28.   )
  29. GROUP BY ma.alumno
  30. ORDER BY promedio DESC
  31. ) ranking
  32. ranking.alumno = 5
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 01/12/2014 a las 10:26
  #7 (permalink)  
Antiguo 01/12/2014, 15:09
Avatar de nemadi  
Fecha de Ingreso: noviembre-2014
Mensajes: 7
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: POSICION de un elemento dentro de un conjunto de datos

Wow!!! Mil gracias por la explicación tan detallada, hasta alguien neófita como yo lo ha entendido!!!! seguiré todas las indicaciones que me has dado y comenzaré a reestructurar toda la base de datos. Después comento como me fue.

Muchas, muuchas gracias!!!!!!!!!!!

Ah! y disculpa lo del código, no sabía lo de Highlight, lo tomaré en cuenta para la próxima, gracias nuevamente!!!

Última edición por nemadi; 01/12/2014 a las 15:20
  #8 (permalink)  
Antiguo 01/12/2014, 16:43
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: POSICION de un elemento dentro de un conjunto de datos

Cita:
Iniciado por nemadi Ver Mensaje
Wow!!! Mil gracias por la explicación tan detallada, hasta alguien neófita como yo lo ha entendido!!!! seguiré todas las indicaciones que me has dado y comenzaré a reestructurar toda la base de datos. Después comento como me fue.
Recuerda que la idea no es que copies y pegues sino que aprendas que es lo que estas haciendo.

Algunas cosas no son del todo sencillas o tan simples como parecen, lo ideal seria que lo pruebes y luego publiques las dudas que aparezcan, las partes de código que no sabes que hacen o para que están, las que sabes que hacen pero no entiendes el como, etc.

Entre todos intentaremos ayudarte.

Saludos!
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #9 (permalink)  
Antiguo 01/12/2014, 17:48
Avatar de nemadi  
Fecha de Ingreso: noviembre-2014
Mensajes: 7
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: POSICION de un elemento dentro de un conjunto de datos

Nuevamente gracias!! agradezco mucho la ayuda!! y no es mi intención copiar y pegar porque de nada serviría si no tengo la más mínima idea de cómo funciona. Y hasta que haga todo lo que sugeriste es que me daré cuenta de todas las interrogantes que surjan jeje

A simple vista lo único que no entiendo por ningún lado es lo de "@rownum"

Código MySQL:
Ver original
  1.   (@rownum:=@rownum+1) posicion...
  2. ...
  3.   (SELECT @rownum:=0) pos,...

Según estoy viendo en la web, se trata de variables globales... Pero ya estoy buscando información al respecto en la documentación de Mysql

Me tendrán aquí pronto preguntando otra vez jeje.

Etiquetas: conjunto, elemento, posicion, 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 13:41.