Problema para obtener registros en MYSQL con SELECT, usando MAX()

seba
23 de Mayo del 2005
Hola:

Tengo una duda con este tema y quisiera recibir su ayuda.
tewngo unaa base de datos que se llama "curso"

-------------------------------------
| alumno | nota | n_control |
------------------------------------
| JUAN | 2.0 | 1 |
| JUAN | 3.0 | 2 |
| JUAN | 4.0 | 3 |
| LUIS | 3.0 | 1 |
| LUIS | 4.0 | 2 |
| LUIS | 2.0 | 3 |
------------------------------------

QUIERO HACER UNA CONSULTA EN MYSQL, QUE ME SEÑALE PARA CADA UNO DE LOS DOS ALUMNOS, CUÃL FUE SU MEJOR NOTA Y EN QUÉ TEST (número de control) LA OBTUVO, tal como se señala a continuación:
----------------------------------
| alumno | mejor_nota | n_control|
----------------------------------
| JUAN | 4.0 | 3 |
| LUIS | 4.0 | 2 |
----------------------------------


por favor, notar que si aplico la siguiente consulta.

SELECT curso.alumno, MAX(curso.nota) AS mejor nota, curso.n_control
FROM curso
GROUP BY curso.alumno

el resultado equivocado será:
----------------------------------
| alumno | mejor_nota | n_control|
----------------------------------
| JUAN | 4.0 | 1 |
| LUIS | 4.0 | 1 |
----------------------------------

es decir, no me asocia los otros datos de la fila a la búsqueda de la máxima nota de cada alumno.

Ayúdenme, pues no manejo este lenguaje.
Seba

gonzalo
23 de Mayo del 2005
si fuese oracle o interbase la solucion seria sencilla:

select c.alumno, c.nota, c.n_control
from curso c
where nota in (

select max(nota)
from curso
where alumno = c.alumno)

order by

pero como estamos en mysql, volvamos a la realidad.
he hecho un pequeño programita a ver si te sirve:

<?php
$conn = mysql_connect("localhost", "root", "12345");
mysql_select_db("instituto");

// alumnos y sus mejores notas
$select = "
select alumno, max(nota) as max_nota
from curso
group by alumno
order by alumno";
$result = mysql_query($select, $conn);
while ($row = mysql_fetch_array($result)){

// para cada alumno, los tests donde alcanzo mejores resultados
$select2 = "
select alumno, nota, n_control
from curso
where alumno = ".$row["alumno"]."
and nota = ".$row["max_nota"]."
order by n_control";
$result2 = mysql_query($select2, $conn);
while ($row2 = mysql_fetch_array($result2)){
echo $row2["alumno"].", ".$row2["nota"].", ".$row2["n_control"]."n";
}
}?>

el programa lanza una consulta:

select alumno, max(nota) as max_nota
from curso
group by alumno
order by alumno

y sobre esa consulta, para cada alumno, obtiene los registros donde ha sacado mejor puntuacion.

una cosa. podria darse el siguiente caso:

Nombre, Nota, Control:
Juan - 7.8 - 2
Juan - 7.8 - 3

Juan ha sacado la misma puntuacion en los tests 2 y 3, por lo que deberian aparecer ambos registros.

otra cosa.
veo que tus alumnos sacan muy bajas puntuaciones, por lo que te voy a dar un suspenso en PHP, para satisfaccion de tus alumnos.

si quieres puedes realizar una aportacion economica al numero de cuenta que viene a continuacion:

xxx-xx-xxx-xxxxxxxxx

Jo! lo que hace el aburrimiento.
sigo currando que el jefe me esta mirando de manera sospechosa y puede aplicarme una descarga electrica en los testiculos si ve que no trabajo.

un saludo.

kokehackz
23 de Mayo del 2005
es que si agrupas por nombre no puedes mostrar los cursos porque para un mismo nombre hay varios cursos

Gavilan
23 de Mayo del 2005
Select * from Curso where nota in (select max(nota) from Curso Where Alumno = Alumno) group by alumno

estoy probando mysql y vi tu problema, no se si ya lo resolviste, y como encontre la solucion pense en ponerla en el foro...
Saludos a todos.