buenas tardes.
alguien me pudiera ayudar.
tengo una base de datos y 2 tablas
alumnos, kardex, y ambos se relacionan por matricula.
donde la tabla kardex lleva un codigo de materia y una calificacion.
realizo una consulta general y me esta arrojando varias veces la matricula y el nombre
anexo
Matricula Nombre Carrera Fecha de Calificacion Materia Calificacion
91901014429 ALMAZA MAURICIO TECNICOs 07/02/2010 M11 90
91901014429 ALMAZA MAURICIO TECNICOs 05/05/2010
M13 80
91901014429 ALMAZA MAURICIO TECNICOs 07/02/2010 M12 90
91901014429 ALMAZA MAURICIO TECNICOs 05/05/2010
M14 80
como le hago para que en la consulta no me repita la matricula y aparezcan los datos de materia y calificacion ?
saludos
y muchas gracias en espera de su pronta respuesta
Has lo siguiente:
DESCRIBE alumnos;
DESCRIBE kardex;
SELECT * FROM alumnos LIMIT 1;
SELECT * FROM kardex LIMIT 1;
Nos muestras exactamente todo lo que devolvió cada una de esas 4 consultas. (por separado)
Luego nos muestras la consulta que estas utilizando para mostrar datos.
PD.: Podrias agrupar datos, con GROUP BY, para que devuelva 1 valor por matricula.. Pero puede que no salga bien... Es mejor que nos muestres bien como es la base de datos, así podemos responderte
mysql> DESCRIBE alumnos;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| matricula | bigint(14) | NO | | NULL | |
| nombres | varchar(50) | NO | | NULL | |
| apellidos | varchar(50) | NO | | NULL | |
| carrera | varchar(40) | NO | | NULL | |
| fechaingreso | date | NO | | NULL | |
| turno | varchar(20) | NO | | NULL | |
| grupo | varchar(5) | NO | | NULL | |
| salon | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
mysql> DESCRIBE kardex;
+-------------------+---------------------+------+-----+---------+--------------
--+
| Field | Type | Null | Key | Default | Extra
|
+-------------------+---------------------+------+-----+---------+--------------
--+
| id | int(10) unsigned | NO | PRI | NULL | auto_incremen
t |
| matricula | bigint(14) unsigned | NO | | NULL |
|
| tetramestre | int(10) unsigned | NO | | NULL |
|
| materia | varchar(45) | NO | | NULL |
|
| codigomateria | varchar(10) | NO | | NULL |
|
| catedratico | varchar(80) | NO | | NULL |
|
| codigocatedratico | varchar(10) | NO | | NULL |
|
| calif1A | int(10) unsigned | NO | | NULL |
|
| fechacalif | varchar(10) | NO | | NULL |
|
| calif2A | int(10) unsigned | YES | | NULL |
|
| fechasegundaop | varchar(10) | YES | | NULL |
|
| califrevalidacion | int(10) unsigned | YES | | NULL |
|
| fechasegopesp | varchar(10) | YES | | NULL |
|
| califrecuperacion | int(10) unsigned | YES | | NULL |
|
| fechacalifrec | varchar(10) | YES | | NULL |
|
| califespecial | int(10) unsigned | YES | | NULL |
|
| fechacalifesp | varchar(10) | YES | | NULL |
|
+-------------------+---------------------+------+-----+---------+--------------
--+
17 rows in set (0.00 sec)
la idea mia es que solo me muestre de la tabla alumnos la matricula y el nombre y de la tabla kardex el codigo de materia y la calificacion, la consulta yo la estoy realizando de la siguiente manera.
select * from alumnos, kardex where alumnos.matricula = kardex.matricula
pero este me arroja el resultado que pegue al prinicio osea todo.
espero me ayuden gracias.
A ver... para mostrar solo matricula y nombre, debes hacer:
SELECT alumnos.nombre, alumnos.matricula
Si quieres que tambien devuelva el Codigo de materia y calificacion, tienes que agregar:
kardex.matricula, kardex.calificacion
o sea, que va quedando así:
SELECT alumnos.nombre, alumnos.matricula, kardex.matricula, kardex.calificacion
Luego si quieres vincular las tablas mediante la matricula, entonces le agregas:
WHERE alumnos.matricula = kardex.matricula
O sea que quedaría así:
SELECT alumnos.nombre, alumnos.matricula, kardex.matricula, kardex.calificacion WHERE alumnos.matricula = kardex.matricula
Prueba eso, y dinos si hay problemas
bueno creo qeu alomejor no me explique.. perdon.
como le hago para listar de la matricula xxxxxxxx todas las calificaciones distintas que este tenga en la tabla kardex? te anexo lo que vi con GROUP BY y con los query que me diste de ejemplo.
en el siguiente ejemplo yo llamo la matricula xxxxxxxxx pero no quiero que me despliege la matricula tantas veces solo quiero ver los codigos de materia que traen xxxxxxxx matricula con sus respectivas calificaciones, no se si se pueda en SQL o tenga que ser en codigo PHP ?
mysql> SELECT alumnos.nombres, kardex.matricula, kardex.codigomateria, kardex.calif1A FROM alumnos, kardex WHERE alumnos.matricula = kardex.matricula GROUP BY codigomateria;
+------------------+-------------+---------------+---------+
| nombres | matricula | codigomateria | calif1A |
+------------------+-------------+---------------+---------+
| ALMANZA MAURICIO | 91901014429 | M10 | 80 |
| ALMANZA MAURICIO | 91901014429 | M11 | 90 |
| ALMANZA MAURICIO | 91901014429 | M12 | 69 |
+------------------+-------------+---------------+---------+
3 rows in set (0.00 sec)
a mi me gustaria desplegarlo asi..
+------------------+-------------+---------------+---------+
| nombres | matricula | codigomateria | calif1A |
+------------------+-------------+---------------+---------+
| ALMANZA MAURICIO | 91901014429 | M10 | 80 |
| | M11 | 90 |
| | M12 | 69 |
+------------------+-------------+---------------+---------+
no se si me explique...
reciban muchos saludos y gracias por su valiosa ayuda.
Citar+------------------+-------------+---------------+---------+
| nombres | matricula | codigomateria | calif1A |
+------------------+-------------+---------------+---------+
| ALMANZA MAURICIO | 91901014429 | M10 | 80 |
| | M11 | 90 |
| | M12 | 69 |
+------------------+-------------+---------------+---------+
Asi de antemano no lo puedes desplegar :xD lamentablemente existe una relacion que quieres violar. El alumno Almanza Mauricio tiene 3 calificaciones, literalmente no puedes romper esa relacion y solo mostrar 1 solo campo y sus 3 relaciones o existe o no existe pero hay una relacion existente en la estructura. Y si matricula = xxxx dice que le pertenece a Mauricio y Mauricio tiene 10 calificaciones guardadas, retornaran las 10 calificaciones y todos los demas campos que lo acompanen. O es o no es, ahora mediante PHP si podrias filtrar y ordenar la data resultante y mostrar solo lo que tu quieres y como tu lo quieres...
Podria solucionarce con un RIGHT JOIN...
TIFA, Skelektron muchas gracias por su apoyo, probare con ambas modalidades que me recomiendan lo revisare mientras ire por cigarros y che e a la tienda para seguir trabajando agusto con ustedes... saludos ;)
CitarPodria solucionarce con un RIGHT JOIN...
Quisiera ;) pero el RIGHT JOIN y el LEFT JOIN lo que retorna es la otra data de la otra tabla donde sobran campos o existen mas campos que la tabla consultada primera. :xD no se entiende lo se...
Un ejemplo rapido, tengo dos tablas:
Tabla1
nombres
Tabla2
apellidos
Suponte que Tabla1 tiene 20 registros , digase 20 nombres, y tabla2 tiene 15 apellidos... :P y tu quieres ver todos los registros de la tabla1 pero haces un join con tabla2 que tiene menos :( entonces haces un RIGHT o LEFT join a la tabla1 depende su ubicacion si primera o segunda :xD y ahi retorna lo que buscas... pero en el caso del amigo en cuestion, creo que ya los registros estan totalmente filtrados como caen...
otravez muchas gracias TIFA me tendre que ir al foro de PHP jajaja sludos
Cita de: ^TiFa^ en 20 Marzo 2010, 00:49 AM
CitarPodria solucionarce con un RIGHT JOIN...
Quisiera ;) pero el RIGHT JOIN y el LEFT JOIN lo que retorna es la otra data de la otra tabla donde sobran campos o existen mas campos que la tabla consultada primera. :xD no se entiende lo se...
Un ejemplo rapido, tengo dos tablas:
Tabla1
nombres
Tabla2
apellidos
Suponte que Tabla1 tiene 20 registros , digase 20 nombres, y tabla2 tiene 15 apellidos... :P y tu quieres ver todos los registros de la tabla1 pero haces un join con tabla2 que tiene menos :( entonces haces un RIGHT o LEFT join a la tabla1 depende su ubicacion si primera o segunda :xD y ahi retorna lo que buscas... pero en el caso del amigo en cuestion, creo que ya los registros estan totalmente filtrados como caen...
Si hace un:
alumnos rigth join materias
Se mostrarán todas las entradas en MATERIAS, con su respectivo alumno. Luego con un GROUP BY matricula, se soluciona todo..
Tio, prueba ésto:
SELECT alumnos.nombres, kardex.matricula, kardex.codigomateria, kardex.calif1A FROM alumnos NATURAL RIGHT JOIN GROUP BY matricula;
mysql> SELECT alumnos.nombre, alumnos.apellido, materias.matricula, materias.calificacion FROM alumnos NATURAL RIGHT JOIN materias GROUP BY matricula;
+--------+----------+-----------+--------------+
| nombre | apellido | matricula | calificacion |
+--------+----------+-----------+--------------+
| Noel | Broda | 1 | 10 |
| Tiffa | Perez | 2 | 9 |
+--------+----------+-----------+--------------+
2 rows in set (0.02 sec)
mysql> select * from materias;
+-----------+--------------+
| matricula | calificacion |
+-----------+--------------+
| 1 | 10 |
| 2 | 9 |
| 2 | 8 |
| 1 | 6 |
+-----------+--------------+
4 rows in set (0.00 sec)
El problema de ahí esta en que no muestra todas las entradas MATRICULA...
Entonces no tendría que hacer el GROUP BY...
Tu tio, lo que quieres ahcer, es mostrar todas las matriculas de la tabla extraña, y con el nombre y apellido del responzable de esa calificacion?
mmm entonces tendria que modificar la estructura de las tablas.
en la tabla kardex se van alimentando las materias con sus calificaciones.
la tabla kardex esta ligada por medio de la matricula con la de alumnos.
cuando doy de alta una calificacion esta se almacena en tabla kardex con numero de matricula, codigo materia y su respectiva calificacion.
donde consulto quiero mostrar solo una vez la matricula pero sus diferentes calificaciones en sus respectivas codigomateria.
espero explicarme
saludos
pienso lo mismo que te dijo ^TiFa^ , no podes hacer que te traiga 1 sola vez la matricula y a la vez todas las calificaciones que tenga...es un contradiccion...es como estar omitiendo campos de una columna y no de otras...y un group by no serviria porque si son de diferentes ¿ fechas y materias ? vos lo deberias mostrar igual.
¿¿ que problema hay con que te muestre la matricula siempre ?? yo no le veo problema...capas estas haciendo mal el planteo de donde queres mostrar eso...por eso pregunto..donde vas a mostrar esos datos..en que estas programando ??
saludos.
Por eso te decia desde un inicio Skeletron ;) no se podia de la manera que el lo desea ;) no lo tomes como un reclamo :rolleyes:
Porque mejor Skeletron, no le haces una especie de script en PHP donde, capte todos los resultados de una consulta con GROUP BY y pos... divida las cadenas y solo muestre la primera cadena de registros completas, y el resto pues solo muestre el 3 registro por ejemplo????
Mediante scripts lo que el pide se puede organizar, mediante procedimientos almacenados podria ser igual.. pero con 1 sola consulta SQL aun no lo considero posible :rolleyes:
:-( sip creo que MYSQL esta bien la consulta
SELECT alumnos.nombres, kardex.matricula, kardex.codigomateria, kardex.calif1A FROM alumnos, kardex WHERE alumnos.matricula = kardex.matricula GROUP BY codigomateria
donde el resultado es este.
+------------------+-------------+---------------+---------+
| nombres | matricula | codigomateria | calif1A |
+------------------+-------------+---------------+---------+
| ALMANZA MAURICIO | 91901014429 | M10 | 80 |
| ALMANZA MAURICIO | 91901014429 | M11 | 90 |
| ALMANZA MAURICIO | 91901014429 | M12 | 69 |
| ALMANZA MAURICIO | 91901014429 | M13 | 78 |
+------------------+-------------+---------------+---------+
como lo digo nuestra amiga TIFA no se puede violar la orden del resultado solo hay que realizar un buen SCRIPT en PHP para qeu me omita las ultimas 3 lineas de nombres y matriculas y solo muestre todas las materias y calificaciones.
THANKS... si estuvieran aqui les invitara unas cheves a todos jaja
No es tan dificil...
$res=mysql_query("
SELECT alumnos.nombre, alumnos.apellido, alumnos.matricula,
kardex.calificacion, kardex.codigomateria
FROM alumnos, kardex
WHERE kardex.matricula=alumnos.matricula");
$row=mysql_fetch_array($res) //hago esto, para poder tomar el nombre antes de entrar al WHILE.
echo 'El alumno '.$row['apellido'].' '.$row['nombre'].' de matricula: '.$row[matricula].' obtuvo las siguiente calificaciones:</br>';
echo 'Codigo de Materia: '.$row['codigomateria'].' | Calificacion: '.$row['calificacion'].'</br>';
while($row=mysql_fetch_array($res)){
echo 'Codigo de Materia: '.$row['codigomateria'].' | Calificacion: '.$row['calificacion'].'</br>';
}
Dime si te funcionó.. Que lo hice aca sin ningun IDE
Si no entiendes el codigo, me dices y te lo explico paso por paso
mmm suena que si va funcionar pero por lo pronto me mando error de sintaxis con el echo.. dejame ver.. quiza le falte algo. lo copie tal cual lo pusiste..
<?PHP
// Conectar con el servidor de base de datos
$conexion = mysql_connect ("localhost", "root", "root")
or die ("No se puede conectar con el servidor");
// Seleccionar base de datos
mysql_select_db ("escuela")
or die ("No se puede seleccionar la base de datos");
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.codigomateria FROM alumnos, kardex WHERE kardex.matricula=alumnos.matricula");
$row=mysql_fetch_array($res) //hago esto, para poder tomar el nombre antes de entrar al WHILE.
echo 'El alumno '.$row['apellidos'].' '.$row['nombres'].' de matricula: '.$row[matricula].' obtuvo las siguiente calificaciones:</br>';
while($row=mysql_fetch_array($res)){ echo 'Codigo de Materia: '.$row['codigomateria'].' | Calificacion: '.$row['calif1A'].'</br>';
}
echo "<ul> </ul>";
echo "<td><div align=left><a href=entra.php>Retornar al Menú Principal</a></div></td>";
}
else
print ("No hay noticias disponibles");
// Cerrar conexión
mysql_close ($conexion);
?>
me marca esto.
Parse error: syntax error, unexpected T_ECHO in C:\AppServ\www\alumnos\consultasola.php on line 30
El alumno ALMANZA MAURICIO de matricula: 91901014429 obtuvo las siguiente calificaciones:
Codigo de Materia: M12 | Calificacion: 70
Codigo de Materia: M11 | Calificacion: 90
Codigo de Materia: M10 | Calificacion: 80
Codigo de Materia: M10 | Calificacion: 90
jajajajajajajjaa ya jaloooooooo gracias a todosss los quieroooo
Gracias a Skeletron por aportar codigo funcional ;) ;) ;)
Perfecto tio...
Cualquier otra cosita, grita! :)
Cya!!
Skeletron tengo otra bronca D: D: espeor no te molestes.
fijate que quiero filtrar la consulta por matricula y hago una pregunta asi.
<form action="consultasola.php" method="post">
<div align="left">
<h1 align="center">Consulta de Calificaciones</h1>
<p> <br>
Matricula del Alumno:
<input name="matricula" type="text" id="matricula" size="17">
<input type=submit name="Buscar" value="Buscar">
</p>
</div>
<td><div align="center">
<h3><a href="entra.php">Retornar al Menú Principal </a></h3>
<p> </p>
<p>Tarea Sistema de Administracion de Alumnos</p>
</div>
</form>
y el otro programa qe se llama consultasola.php est asi
// Conectar con el servidor de base de datos
$conexion = mysql_connect ("localhost", "root", "root")
or die ("No se puede conectar con el servidor");
// Seleccionar base de datos
mysql_select_db ("escuela")
or die ("No se puede seleccionar la base de datos");
// Obtener datos
$matricula= $_REQUEST['matricula']; <---------aqui tambien utilice el GET y me sigue mostrando el resultado anterior, le puse el POST y tampoco me lo aceptal
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.codigomateria FROM alumnos, kardex WHERE kardex.matricula=alumnos.matricula");
$row=mysql_fetch_array($res); //hago esto, para poder tomar el nombre antes de entrar al WHILE.
echo "El alumno ".$row['nombres']." ".$row['apellidos']." y con Matricula: ".$row[matricula]." obtuvo las siguientes calificaciones:</br>";
while($row=mysql_fetch_array($res)){
echo "Materia: ".$row['codigomateria']." | Calificacion: ".$row['calif1A']."</br>";
}
echo "<ul> </ul>";
echo "<ul> </ul>";
echo "<td><div align=left><a href=entra.php>Retornar al Menú Principal</a></div></td>";
no me acepta leer una variable de afuera.
le puse el trim
trim ($matricula);
if (!$matricula || !$matricula)
{
echo "Campo de búsqueda vacío . Inténtalo de nuevo. ";
exit;
pero no me funciono nomas me sale la primer matricula
Bien tio... Por lo que vemos, te falta mucho de PHP.. Pero no te preocupes.. PHP es facil de aprender.. Si sigues tocando mucho, aprenderas rapido..
La primer pagina esta perfecta..
Pero la 2º (la de la consulta) esta mal..
SI lo que tu quieres, es filtrar las consultas por una matricula especifica, entonces, los cambios no tienen que ser en el codigo, sino, solamente en la consulta SQL...
Tu tienes ésto:
// Obtener datos
$matricula= $_REQUEST['matricula'];
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.codigomateria FROM alumnos, kardex WHERE kardex.matricula=alumnos.matricula");
Primero, borra: $_REQUEST['matricula'] <<<< no es necesario
Y luego, hay que hacer los cambios en el SQL...
Si esa consulta devuelve todas las matriculas por alumnos, simplemente le tienes que agregar al WHERE, lo siguiente:
AND alumno.matricula=".$_POST['matricula']
Para que quede así:
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.codigomateria FROM alumnos, kardex WHERE kardex.matricula=alumnos.matricula AND alumno.matricula=".$_POST['matricula']);
OJO...
Supongamos que alguien, en el campo de MATRICULA, en vez de escribir un numero de matricula, escribe un codigo SQL...
Por ejemplo:
'' UNION XXXXXXXXXXXXXXXXXX
La consulta SQL se trasformaría a un ataque contra tu base de datos...
Tienes que leer en que consiste el ataque: SQL INYECTION.
Una vez que entiendas como es, y en que consiste (que es MUY FACIL DE ENTENDER), querras saber como se evita ese tipo de ataques, y es muy facil:
Agrega a cada variable que coloques dentro de la sentencia SQL, lo siguiente:
mysql_real_escape_string()
Para que quede así:
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.codigomateria FROM alumnos, kardex WHERE kardex.matricula=alumnos.matricula AND alumno.matricula=".mysql_real_escape_string($_POST['matricula']));
Y tio... ahora que lo pienso:
El primer codigo que te dí de PHP, ese funcionaba cuando solo habia 1 alumnos en tu base de datos... ya que tampoco filtrabamos nombrs de alumnos,, ni nada de eso...
Y efectivamente, éste es el codigo correcto ;)
Un placer ayduarte..
Si el codigo no te funciona, o sigues teniendo dudas, tu sigue preguntando
que onda amigo.
quedo asi.
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.codigomateria, kardex.fechacalif FROM alumnos INNER JOIN kardex ON kardex.matricula=alumnos.matricula WHERE alumnos.matricula = $matricula");
donde desde otro formulaio pregunt por la matricula. y ya me da la matricula queyo quiero..
efectivamente me falta mas en php y mysql y aqui aprendere mucho con ustedes, muchas gracias ahora lo que voy a hacer es acomodr los echo en una tabla o determinada parte con un formato.
no viene adjunto el codigo de las 2 post anteriores tuyos.
Mira, ese codigo que te di ultimo, es lo que debes reemplazarle a todo el codigo anterior, para que funcione bien POR MATRICULA...
Entiendes?
Tu ingresas la matricula en la pagina xxx.php la cual tiene un form que dirije a yyy.php..
en yyy.php tienes que tener lo anterior, ese while($row=....) que te he dado, en reemplazar la cadena mysql_query() por lo que te dí ahí...
Digamos que tiene que quedar así:
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.codigomateria, kardex.fechacalif FROM alumnos INNER JOIN kardex ON kardex.matricula=alumnos.matricula WHERE alumnos.matricula =".$_POST['matricula']);
$row=mysql_fetch_array($res) //hago esto, para poder tomar el nombre antes de entrar al WHILE.
echo 'El alumno '.$row['apellido'].' '.$row['nombre'].' de matricula: '.$row[matricula].' obtuvo las siguiente calificaciones:</br>';
echo 'Codigo de Materia: '.$row['codigomateria'].' | Calificacion: '.$row['calificacion'].'</br>';
while($row=mysql_fetch_array($res)){
echo 'Codigo de Materia: '.$row['codigomateria'].' | Calificacion: '.$row['calificacion'].'</br>';
}
yessss muchas gracias señor ya pude...
Perfecto...
Entendes bien el codigo? o queres que te lo explique (así aprendes un poquito mas de php)
si si le entendi bien muchas gracias, ahora lo que quiero es darle formato en una especie de tabla, no se si me explique.
lo puse asi..
Consulta Calificaciones de Alumnos
El alumno CELINA NINFA GUERRA y con Matricula: 91901014428 obtuvo las siguientes calificaciones:
Materia Calificacion Fecha de Calificacion
M10 90 01/01/2010
M12 90 01/01/2010
M13 90 01/01/2010
pero me gustaria ponerlo asi. ando investigando la opcion de tabla
El Alumno CELIA NINFA GUERRA y con Matricula: 91901014428 obtuvo las siguientes calificaciones:
fecha de aplicacion
Materia M10 M12 M13 01/01/2010
Calificacion 90 90 90 01/02/2010
por ejemplo.
saludos
Tambien es facil...
Cada "RENGLON" en HTML, se delimita con: <tr>
Y cada TROZO DEL RENGLON (o celda) se delimita con <td>
Se supone que debes tener un RENGLON por cada entrada, y a cada dato lo debes tener en una CELDA..
Entonces, se torna facil:
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.codigomateria, kardex.fechacalif FROM alumnos INNER JOIN kardex ON kardex.matricula=alumnos.matricula WHERE alumnos.matricula =".$_POST['matricula']);
$row=mysql_fetch_array($res) //hago esto, para poder tomar el nombre antes de entrar al WHILE.
echo 'El alumno '.$row['apellido'].' '.$row['nombre'].' de matricula: '.$row[matricula].' obtuvo las siguiente calificaciones:</br>';
echo '<table>';
echo '<tr>';
echo '<td><b>Codigo de Materia</b></td><td><b>Calificacion</b></td>';
echo '</tr>';
echo '<tr>';
echo '<td>'.$row['codigomateria'].'</td><td>'.$row['calificacion'].'</td>';
echo '</tr>';
while($row=mysql_fetch_array($res)){
echo '<tr>';
echo '<td>'.$row['codigomateria'].'</td><td>'.$row['calificacion'].'</td>';
echo '</tr>';
}
echo '</table>';
Lo pruebas y dices si funcionó
Si no sabes como agregarle FECHA DE CALIFICACION, me dices, y modifico éste mismo post con el agregado
de echo ya lo habia echo con el print
echo "<td><div align=left>El alumno ".$row['nombres']." ".$row['apellidos']." y con Matricula: ".$row[matricula]." obtuvo las siguientes calificaciones:</a></div></td></br>";
while($row=mysql_fetch_array($res)){
print ("<TABLE>\n");
print ("<TH>Materia</TH>\n");
print ("<TH>Calificacion</TH>\n");
print ("<TH>Fecha de Calificacion</TH>\n");
print ("</TR>\n");
print ("<TR>\n");
print ("<TD>" . $row['codigomateria'] . "</TD>\n");
print ("<TD>" . $row['calif1A'] . "</TD>\n");
print ("<TD>" . $row['fechacalif'] . "</TD>\n");
}
print ("</TABLE>\n");
y jalo tambien,
pregunta. se le puede hacer que cierto dato que venga por ejemplo M10 que corresponde a una materia despliege el nombre actual? tendria que manejar un IF ? dentro ...? IF $materia = M10, entonces print texto?
Desplegar?..
Quieres decir que en vez de aparecer M10, que aparezca el nombre original de la materia?
Si, puede ser, y con IF...
Tambien tendrás que traer a materias.nombre, para ver: SI ES M10, imprimir NOMBRE
mmmm ok en la tabla kardex tengo un campo que se llama materia pero no se esta llenando desde el programa de captura de calificaciones porque tengo unos VALUE que seleccionan la opcion y solo esta almacenandose el codigo de materia
aunque tengo una tabla que se llama materias y se liga por el codigomateria, podre almacenarlas alli y luego las saco de alli vdd?
gracias por tu valiosa ayuda..
Si... Has eso.. Has eso con la otra tabla MATERIAS... Liga otra tbala mas :)
muchisimas gracias MASTER dejame le echo ganas y hay te informo para si se me atora la carreta, gracias
de nada tio..
Pasate cuando quieras :)
oye amigo Skeletron la verdad que ya me perdi en la sentencia de MySQL como le haria para ligar la tabla numero 3, ya hice el programa que caputura las materias con su codigo ligada codigomateria, y se dio de alta los nombres de cada materia con su codigo. osease que use, en tabla materias, codigomateria, materia, codigocatedratico para futuras.. jejejeje
entonces seria asi??
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.codigomateria, kardex.fechacalif FROM alumnos INNER JOIN kardex INNER JOIN materias ON kardex.matricula=alumnos.matricula WHERE alumnos.matricula =".$_POST['matricula']);
le agrege un inner join a materias? es correcto?
slds
Entre el SELECT y el FROM, tambien te falta colocar MATERIAS.nombre
Y esos innert join creo que estan mal..
Pero ahora me estoy yendo... luego los miro.. Enviale un mensaje privador a TIFFA par que te responda por aqui
ok muchas gracias MASTER.... hola TIFFA andas por alli D: gracias por todo el apoyo amigos..
ya di con el query correcto.
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.fechacalif, materias.materia FROM alumnos INNER JOIN kardex INNER JOIN materias ON kardex.matricula=alumnos.matricula WHERE alumnos.matricula =".$_POST['matricula']);
pero me las muestra repetidas en el script creo qeu tengo que ponerle otro array
Cita de: royerphpmysql en 21 Marzo 2010, 02:51 AM
ya di con el query correcto.
$res=mysql_query("SELECT alumnos.nombres, alumnos.apellidos, alumnos.matricula, kardex.calif1A, kardex.fechacalif, materias.materia FROM alumnos INNER JOIN kardex INNER JOIN materias ON kardex.matricula=alumnos.matricula WHERE alumnos.matricula =".$_POST['matricula']);
pero me las muestra repetidas en el script creo qeu tengo que ponerle otro array
si ese "INNER JOIN kardex" no va asi...y yo soy partidario de no poner el nombre de la tabla delante de los campos sino un simple "alias" queda mucho mas claro y entendible y la consulta no se hace tan grande...por ejemplo:
SELECT al.nombres, al.apellidos, al.matricula, k.calif1A, k.fechacalif, mat.materia
FROM alumnos al
INNER JOIN kardex k ON aca pones la relacion...
INNER JOIN materias mat ON k.matricula=al.matricula
WHERE al.matricula = blabla...
y si podes ordenala queda mucho mas claro al leer..porque te quiero ver con una consulta larga en una linea...imposible de leer...
saludos.
muchas gracias seba123neo :xD
hola amigos nuevamente molestandolos.
cual seria el comando de mysql para poder comparar las 2 tablas.
y poder sacar a pantalla el resultado, es decir. si alimente calificaciones de 2 alumnos se agregan a la tabla kardex. en la tabla materia tengo todas las materias. con que comando compararia los datos y sacar a pantalla las materias faltantes?
saludos
Sería algo así como un LEFT JOIN que sea NULL..
materias left join kardex on xxxxx where xxxx is null
Algo así...
pero eso aplica cuando las materias completas se almacenan en la misma tabla no?
en este caso en la tabla kardex se almacenan solo las amterias qeu se le captura la calificacion y en la tabla materias esta el catalogo de materias con el codigomateria, en kardex tengo codigomateria con materia. no se si me explico.
lo que tendria uqe hacer es consultar kardex y materias y comparar los valores de codigo materia en ambos? e imprimir null el que no tenga los mismos valores que tiene la tabla materias?
Cita de: royerphpmysql en 23 Marzo 2010, 04:02 AM
pero eso aplica cuando las materias completas se almacenan en la misma tabla no?
en este caso en la tabla kardex se almacenan solo las amterias qeu se le captura la calificacion y en la tabla materias esta el catalogo de materias con el codigomateria, en kardex tengo codigomateria con materia. no se si me explico.
lo que tendria uqe hacer es consultar kardex y materias y comparar los valores de codigo materia en ambos? e imprimir null el que no tenga los mismos valores que tiene la tabla materias?
me podrias dar un ejemplo detallado de lo que queres ? o sea un ejemplo de como seria la salida de datos que queres ver...
saludos.
es deci. yo consulto esto dandole la matricula.
Pantalla Consulta Calificaciones de Alumnos
2010-03-23 10:08:39
El alumno CELINA NINFA GUERRA con Matricula: 91901014428 tiene las siguientes calificaciones:
Materia Calificacion Fecha Calificacion
METODOLOGIA DE LA LECTURA 80 01/01/2010
TEXTOS LITERARIOS I 70 01/01/2010
esto se almacena al llenar la calificacion en una tabla llamada kardex.
pero tengo una tabla que se llama materias dode esta ultima tiene todas las materias. que necesito hacer para que el resto de las materias que le faltan al alumno aparezcan en blano en el mismo listado... ambas tienen su codigomateria. kardex y maerias..
gracias
lo que necesitas es usar lo que se llama
LEFT OUTER JOIN, busca en internet para mas informacion de lo que hace, pero es simple o sea te hace la relacion y te deja en null los que no tienen relacion, ya que con un INNER JOIN comun no te los devolveria...y el SELECT principal entonces se deberia hacer a la tabla de Materias.
me cree en MySQL 3 tablas, tratando de imitar las tuyas...no le puse todos los campos que vos tenes, solo los principales...despues vos lo adaptas...hice lo siguiente:
TABLA MATERIAS
Citarcodigomateria nombre
1 Matematicas
2 Fisica
3 Quimica
4 Literatura
5 Geografia
6 Etica
7 Filosofia
8 Computacion
TABLA ALUMNOS
Citarmatricula nombre
111 Sebastian
222 Tifa
333 Skeletron
TABLA KARDEX
Citarmatricula codigomateria calificacion
111 1 70
111 2 80
111 3 50
222 1 70
333 2 80
en este caso solo vamos a filtrar los datos del alumno "Sebastian" de matricula "111"...fijate que solo tiene 3 materias calificadas...de 8 que son en total, el SELECT seria asi:
SELECT a.nombre AS nombreAlumno,m.nombre AS nombreMateria,IFNULL(k.calificacion,'NO CALIFICADO') AS calificacion
FROM materias m
LEFT OUTER JOIN kardex k ON m.codigomateria=k.codigomateria
LEFT OUTER JOIN alumnos a ON k.matricula=a.matricula
WHERE k.matricula='111' OR k.matricula IS NULL
y nos retorna:
Citar
Sebastian Matematicas 70
Sebastian Fisica 80
Sebastian Quimica 50
NULL Literatura NO CALIFICADO
NULL Geografia NO CALIFICADO
NULL Etica NO CALIFICADO
NULL Filosofia NO CALIFICADO
NULL Computacion NO CALIFICADO
saludos.
muchas gracias por tu ayuda SEBA
voy a revisar este dato FROM materias m porque ya me perdi voy a leer un poco de alias.
saludos
consulta SQL:
SELECT a.nombres AS nombreAlumno, m.materia AS nombreMateria, IFNULL( k.calif1A, 'NO CALIFICADO' ) AS calif1A
FROM materias m
LEFT OUTER JOIN kardex k ON m.codigomateria = k.codigomateria
LEFT OUTER JOIN alumnos a ON k.matricula = a.matricula
WHERE k.matricula = '91901014430'
OR k.matricula IS NULL
LIMIT 0 , 30
MySQL ha dicho:
#1267 - #1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (latin1_spanish_ci,IMPLICIT) for operation '='
Hola Alguien me podria ayudar a descifrar este error.
me marca enmedio de estos 2
LEFT OUTER JOIN kardex k ON m.codigomateria = k.codigomateria
LEFT OUTER JOIN alumnos a ON k.matricula = a.matricula
saludos
(latin1_swedish_ci,IMPLICIT) and (latin1_spanish_ci,IMPLICIT)
Fijate que seguramente estas haciendo una comparacion entre "swendish" y "spanish"..
Cambia el COTEJAMIENTO de tu columna.. de la que da error..
Realmente, la consulta es correcta. Pero, el motor de MySQL ve un problema al querer comparar dos valores (=) codificados con diferente juego de caracteres.
Para darle solucion a tu problema ya que te seguiras topando con el mismo sino lo cortas de raiz... Hay que indicarle a PHP que realize las consultas siempre con un solo juego de caracteres.
Haz lo siguiente chico...
En tu codigo PHP en la parte donde vayas a trabajar con MySQL edita y haz lo siguiente:
Citar
<?php
@mysql_query("SET collation_connection = latin1_spanish_ci;");
$result=mysql_query("bla bla bla
O de paso reiniciar el servidor con ese collation asignado pero nahhh , haz lo anterior dentro de tu PHP :P
si, SQL Server hace lo mismo cuando queres hacer una relacion con 2 tablas de colaciones distintas, ya me ha pasado, se la cambias y listo el pollo...
saludos.
@mysql_query("SET collation_connection = latin1_spanish_ci;");
$res=mysql_query("SELECT a.nombres AS nombreAlumno, m.materia AS nombreMateria, IFNULL( k.calif1A, 'NO CALIFICADO' ) AS calif1A
FROM materias m
LEFT OUTER JOIN kardex k ON m.codigomateria = k.codigomateria
LEFT OUTER JOIN alumnos a ON k.matricula = a.matricula WHERE k.matricula = ".$_POST['matricula']);
$row=mysql_fetch_array($res);
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
saben a que se debera? ya investigue pero no lo puedo quitar ;) saludos
creo que la matricula es string no ? tendria que ir entre comillas simples no ?? o ahi ya esta con comillas ?? pregunto porque de MySQL en web no conozco...
excelente amigos ya quedo listo gracias por sus consejos .. peo no me da el resultado esperado puesto a que no me da el listado de materias y no me dice no esta calificado quiza este aplicando mal el codigo php. saludos ;(
gracias a todos por su ayudaya logre mi objetivo..
dios los bendiga a todos
hola gente buen dia com estan.
me surgio una gran duda y pido de su asesoria, tengo la siguiente consulta.
$res=mysql_query("SELECT k.fechacalif, a.apellidos, a.nombres AS nombreAlumno, m.materia AS nombreMateria, IFNULL( k.calif1A, 'NO CALIFICADO' ) AS calif1A
FROM materias m
LEFT OUTER JOIN kardex k ON m.codigomateria = k.codigomateria
LEFT OUTER JOIN alumnos a ON k.matricula = a.matricula
WHERE k.matricula =".$_POST['matricula']." OR k.matricula IS NULL");
y esta me da el siguiente resultado.
El alumno PEPE TOÑO con Matricula: 91901014431
Tiene las Siguientes Calificaciones
Materia Calificacion Fecha Calificacion
INGLES I 89 01/01/2010
MATEMATICAS I 78 02/01/2010
TALLER DE REDACCION I NO CALIFICADO
METODOLOGIA DE LA LECTURA NO CALIFICADO
HISTORIA MODERNA NO CALIFICADO
pero si consulto un alumno diferente no me muestra las materias que ya califico el otro a que se debera?
El alumno PANCHO PEREZ con Matricula: 91901014429
Tiene las Siguientes Calificaciones
Materia Calificacion Fecha Calificacion
TALLER DE REDACCION I NO CALIFICADO
METODOLOGIA DE LA LECTURA NO CALIFICADO
HISTORIA MODERNA NO CALIFICADO
ojala puedan darme una idea. muchas gracias
el codigo que estoy aplicando es el siguiente.
$res=mysql_query("SELECT k.fechacalif, a.apellidos, a.nombres AS nombreAlumno, m.materia AS nombreMateria, IFNULL( k.calif1A, 'NO CALIFICADO' ) AS calif1A
FROM materias m
LEFT OUTER JOIN kardex k ON m.codigomateria = k.codigomateria
LEFT OUTER JOIN alumnos a ON k.matricula = a.matricula
WHERE k.matricula =".$_POST['matricula']." OR k.matricula IS NULL");
$row=mysql_fetch_array($res); //hago esto, para poder tomar el nombre antes de entrar al WHILE.
echo '<tr>';
echo '<td><b>';
echo '</td></b>';
echo '</tr>';
echo "<ul> </ul>";
echo "<td><div align=left>El alumno <b>".$row['nombreAlumno']." ".$row['apellidos']."</b> con Matricula: <b>".$_POST[matricula];
echo "<td><div align=left></b>Tiene las Siguientes Calificaciones </a></div></td></br>";
echo '<table>';
echo '<tr>';
echo '<td><div align=center><b>Materia</b></td><td><b>Calificacion</b><td><b>Fecha Calificacion</b></td>';
echo '</tr>';
echo '<tr>';
echo '<td><div align=center>'.$row['nombreMateria'].'</td><td><div align=center>'.$row['calif1A'].'</td><td><div align=center>'.$row['fechacalif'].'</td>';
echo '<td>';
while($row=mysql_fetch_array($res))
{
echo '<tr>';
echo '<td><div align=center>'.$row['nombreMateria'].'</td><td><div align=center>'.$row['calif1A'].'</td><td><div align=center>'.$row['fechacalif'].'</td></div>';
echo '</tr>';
echo '<td>';
}
echo '</table>';
gracias por su ayuda
Y estas seguro quue ya calificó?
el primero califico ingles y matematicas y el segundo todavia no. si se las califico aparecen pero si no se las pongo no aparecen y deberia de aparecer como no calificado..
Entonces tu problema literalmente es... que si un alumno tiene materias con calificacion y el otro alumno en esas mismas materias no tiene ninguna calificacion... entonces las del segundo alumno no se muestran en pantalla??? :rolleyes:
Espero no sea mucho pedir pero... podrias colocar aca un ejemplo de los campos de las 2 tablas que estas usando para hacer tus JOINES ;) algo asi tipo:
'Tengo 2 tablas, la primera tiene los siguientes campos : '
tabla1
alumnos,
matricula,
fecha,
materia
tabla2
matricula,
materia
Aunque creo tu problema (si es lo que te pregunte inicialmente) estaria aqui:
CitarIFNULL( k.calif1A, 'NO CALIFICADO' )
Porque ahi dices si calificacion tiene un valor NULL retorname 'No calificado' bien perfecto.. ahora que pasa, estas haciendo 1 JOIN de 2 tablas yo no conozco las estructuras de las 2 tablas (Por eso te pido una demostracion) pero, que pasa cuando 2 campos en ambas tablas se comparan y uno tiene valor no nulo sin embargo el otro si tiene un valor nulo??? Tu unica condicion es que cuando calificacion sea NULL retorne 'NO CALIFICADO' pero para que esto se cumpla... ambos campos comparados deben tener valor NULL, lo que si podrias intentar completar el IF con algo tipo:
IF(k.calif1A IS NULL, 'NO CALIFICA', k.califi1A)O sea si uno de los valores es Nulo 'no califica' de lo contrario pues tirame el valor que existe. Pero me puedo equivocar, no conozco la estructura de las tablas... solo estoy ofreciendo un estimado acorde a lo que veo.
:P
HOLA TIFA muchas gracias por tu ayuda, aqui te muestro las estructuras de las tablas.
son, alumnos, kardex y materias.
mysql> describe alumnos;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| matricula | bigint(14) | NO | | NULL | |
| nombres | varchar(50) | NO | | NULL | |
| apellidos | varchar(50) | NO | | NULL | |
| carrera | varchar(40) | NO | | NULL | |
| fechaingreso | date | NO | | NULL | |
| turno | varchar(20) | NO | | NULL | |
| grupo | varchar(10) | NO | | NULL | |
| salon | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
mysql> describe kardex;
+-------------------+---------------------+------+-----+---------+------------
--+
| Field | Type | Null | Key | Default | Extra
|
+-------------------+---------------------+------+-----+---------+------------
--+
| id | int(10) unsigned | NO | PRI | NULL | auto_increm
t |
| matricula | bigint(14) unsigned | NO | | NULL |
|
| tetramestre | int(10) unsigned | NO | | NULL |
|
| materia | varchar(45) | YES | | NULL |
|
| codigomateria | varchar(10) | NO | | NULL |
|
| catedratico | varchar(80) | NO | | NULL |
|
| codigocatedratico | varchar(10) | NO | | NULL |
|
| calif1A | int(10) unsigned | NO | | NULL |
|
| fechacalif | varchar(10) | NO | | NULL |
|
| calif2A | int(10) unsigned | YES | | NULL |
|
| fechasegundaop | varchar(10) | YES | | NULL |
|
| califrevalidacion | int(10) unsigned | YES | | NULL |
|
| fechasegopesp | varchar(10) | YES | | NULL |
|
| califrecuperacion | int(10) unsigned | YES | | NULL |
|
| fechacalifrec | varchar(10) | YES | | NULL |
|
| califespecial | int(10) unsigned | YES | | NULL |
|
| fechacalifesp | varchar(10) | YES | | NULL |
|
+-------------------+---------------------+------+-----+---------+------------
--+
17 rows in set (0.02 sec)
mysql> describe materias;
+-------------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+------------------+------+-----+---------+-------+
| codigomateria | varchar(10) | NO | PRI | NULL | |
| materia | varchar(255) | NO | | NULL | |
| carrera | varchar(3) | NO | | NULL | |
| tetra | int(10) unsigned | NO | | NULL | |
| codigocatedratico | varchar(10) | NO | | NULL | |
+-------------------+------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql>
gracias por tu valioso apoyo..
rogelio
Unos puntitos.
Acorde a los datos que estas solicitando, no necesitas usar un JOIN con las 3 tablas.... de hecho con 2 tablas es mas que suficiente (Para este caso). :rolleyes: porque lo digo??? porque tienes el campo materia dentro de la tabla Kardex, que asumo se relaciona en ese mismo campo con la tabla Materias y puesto que la relacion posee el mismo valor... y es el unico campo que referencias de esta tabla en tu consulta SQL... felizmente puedes descartar usar esta tabla en tu consulta SQL, y sencillamente hacer el JOIN con las tablas Kardex y Alumnos, obteniendo el campo materia de la tabla Kardex.
Otra cosita, ten muy en claro el tamanio (espacio) que ocupan los tipos de datos, cuidado con esos tipos de datos que leo tipo bigint en un campo de matricula... y cuidado con el almacenamiento de los varchar que veo hasta 255 cuando apenas vas a guardar algo que a lo maximo ocuparia 50 caracteres.
Ten en cuenta que tu consulta SQL esta buscando la nota de 1 sola persona a la vez.. o donde su matricula sea nula
Te comento que he recreado las tablas que tienes.... con los siguientes datos:
mysql> select * from kardex; +------+-----------+-------------+--------------+---------------+
| id | matricula | materia | calificacion | codigomateria |
+------+-----------+-------------+--------------+---------------+
| 1 | 200 | matematica | 80 | matematica |
| 2 | 300 | lenguaje | NULL | lenguaje |
| 3 | 400 | historia | 70 | historia |
| 4 | 500 | matematicax | NULL | matematicax |
| 5 | 600 | lenguajex | 87 | lenguajex |
+------+-----------+-------------+--------------+---------------+
5 rows in set (0.00 sec)
mysql> select * from alumnos;
+------+-----------+---------+-----------+--------------+
| id | matricula | nombres | apellidos | fechaingreso |
+------+-----------+---------+-----------+--------------+
| 1 | 200 | Jose | Perez | NULL |
| 2 | 300 | Mario | Lopez | NULL |
| 3 | 400 | Gloria | Mar | NULL |
| 4 | NULL | Pepe | Martinez | NULL |
| 5 | NULL | Carlos | Manuel | NULL |
+------+-----------+---------+-----------+--------------+
5 rows in set (0.00 sec)
Usando como modelo tu consulta SQL, y me aparecen perfectamente los datos solicitados (La unica diferencia es que aca obvio
usar la tercera tabla Materias, pero luego es lo mismo):
mysql> select a.apellidos, a.nombres as nombreAlumno, k.materia as nombreMateria, if( k.calificacion is null, 'NO CALIFICADO', k.calificacion) as Califica from kardex k left join alumnos a on k.matricula = a.matricula where a.matricula = 300 or a.matricula is null;
+-----------+--------------+---------------+---------------+
| apellidos | nombreAlumno | nombreMateria | Califica |
+-----------+--------------+---------------+---------------+
| Lopez | Mario | lenguaje | NO CALIFICADO |
| NULL | NULL | matematicax | NO CALIFICADO |
| NULL | NULL | lenguajex | 87 |
+-----------+--------------+---------------+---------------+
3 rows in set (0.00 sec)
mysql> select a.apellidos, a.nombres as nombreAlumno, k.materia as nombreMateria, if( k.calificacion is null, 'NO CALIFICADO', k.calificacion) as Califica from kardex k left join alumnos a on k.matricula = a.matricula where a.matricula = 200 or a.matricula is null;
+-----------+--------------+---------------+---------------+
| apellidos | nombreAlumno | nombreMateria | Califica |
+-----------+--------------+---------------+---------------+
| Perez | Jose | matematica | 80 |
| NULL | NULL | matematicax | NO CALIFICADO |
| NULL | NULL | lenguajex | 87 |
+-----------+--------------+---------------+---------------+
3 rows in set (0.00 sec)
Podrias publicar aca que valores en ambas tablas o en las 3 tablas si todavia quieres continuar usando los JOINS con las 3. Que valores tienen ambos alumnos en las 3 o 2 tablas aca...
tifa disculpa lo que tu me pones esta perfecto pero creo que no me di a entender bien.
lo que sucede es que en tabla materias tengo almacenadas 33 materias y son las que quiero imprimir en la consulta de cualquier alumno siempre.
en la primer consulta me imprime bien las 33 materias que es lo que quiero.
pero si consulto otro alumno como a PANCHO PEREZ no me muestra las 33 solo 31
en esta consulta me muestra las 33 materias de tabla materias con sus respectivas calificadas..
El alumno PEPE TOÑO con Matricula: 91901014431
Tiene las Siguientes Calificaciones
Materia Calificacion Fecha Calificacion
INGLES I 89 01/01/2010
MATEMATICAS I 78 02/01/2010
TALLER DE REDACCION I NO CALIFICADO
METODOLOGIA DE LA LECTURA NO CALIFICADO
HISTORIA MODERNA NO CALIFICADO
pero en esta segunda consulta no me muestra las 33 materias de la tabla materias porque el alumno anterior ya estan calificadas
me muestra lo siguiente..
El alumno PANCHO PEREZ con Matricula: 91901014429
Tiene las Siguientes Calificaciones
Materia Calificacion Fecha Calificacion
TALLER DE REDACCION I NO CALIFICADO
METODOLOGIA DE LA LECTURA NO CALIFICADO
HISTORIA MODERNA NO CALIFICADO
no se si me explique.. PANCHO PEREZ me muestra 31 materias de la tabla materias y me faltan 2 materias mas que deberia de mostrar de la tabla materias independientemente si fueron calificadas por otro alumno..
gracias. tifa
Yo te entendi perfectamente ;) intentas decirme que hay 3 materias que no se presentan en pantalla porque tienen valores NULL pero cuando tienen valor real asignado si se presentan en pantalla... de lo contrario no :P
Te agradeceria si me mostrases entonces, en las 3 tablas en cuestion que valores le corresponden a estos 2 alumnos para yo tener una guia mejor del asunto.
en la tabla materias tengo almacenado lo siguiente:
mysql> select * from materias;
+---------------+--------------------------------+---------+-------+------------
-------+
| codigomateria | materia | carrera | tetra | codigocated
ratico |
+---------------+--------------------------------+---------+-------+------------
-------+
| 10 | INGLES I | | 0 | C1
|
| 11 | MATEMATICAS I | | 0 | C1
|
| 12 | TALLER DE REDACCION I | | 0 | C1
|
| 13 | METODOLOGIA DE LA LECTURA | | 0 | C1
|
| 14 | HISTORIA MODERNA | | 0 | C1
es un listsado de 33 materias.
al consultar cada alumno me debe de mostrar las 33 materias de esta tabla.
listado como aqui.
El alumno PEPE TOÑO con Matricula: 91901014431
Tiene las Siguientes Calificaciones
Materia Calificacion Fecha Calificacion
INGLES I 89 01/01/2010
MATEMATICAS I 78 02/01/2010
TALLER DE REDACCION I NO CALIFICADO
METODOLOGIA DE LA LECTURA NO CALIFICADO
HISTORIA MODERNA NO CALIFICADO
pero si yo quiero consultar un alumno diferente y que no esta calificado como este que tiene 2 me muestra lo siguiente.
El alumno PANCHO PEREZ con Matricula: 91901014429
Tiene las Siguientes Calificaciones
Materia Calificacion Fecha Calificacion
TALLER DE REDACCION I NO CALIFICADO
METODOLOGIA DE LA LECTURA NO CALIFICADO
HISTORIA MODERNA NO CALIFICADO
es decir... el alumno que no ha calificado nada me esta omitiendo las primeras 2 materias que serian ingles y español.. y solo me muestra eso... espeor entenderme un pquito mejor.. ;)
Para los que no se enteran (y por si le pasa a alguien vamos :rolleyes:)
Royer me envio la muestra de sus 3 tablas por MP (protegiendo sus datos al acceso publico esta en su derecho ;) ) y bueno, resulta ser que los datos que el quiere sacar existen en la Tabla Alumnos y la tabla Materias pero no tienen ningun registro en Kardex ;) (Solo de los alumnos que el quiere sacar y les pasa esto). Por lo que le respondi:
Royer me aclaraste mejor ahora ;-) entonces el alumno que NO tiene ningun registro en la tabla Kardex ... hay es que esta tu problema chico :rolleyes:
Mira agregue un usuario extra a la tabla Alumnos:
mysql> select * from alumnos;
+------+-----------+---------+-----------+---------+--------------+-------+--------+-------+
| id | matricula | nombres | apellidos | carrera | fechaingreso | turno | grupo | salon |
+------+-----------+---------+-----------+---------+--------------+-------+--------+-------+
| 6 | 919 | PEPE | TONO | PREPA | 0000-00-00 | TARDE | GRUPO1 | 1 |
| 7 | 212 | PANCHO | PEREZ | PREPA | 0000-00-00 | TARDE | GRUPO2 | 1 |
| 9 | 100 | MARIA | LOPEZ | NULL | NULL | TARDE | GRUPO1 | 1 |
+------+-----------+---------+-----------+---------+--------------+-------+--------+-------+
Pero no le agregue absolutamente nada en Kardex a este nuevo usuario (QUe es MARIA LOPEZ):
mysql> select * from kardex;
+------+-----------+-------------+-------------+---------------+---------+------------+
| id | matricula | tetramestre | materia | codigomateria | calif1A | fechacalif |
+------+-----------+-------------+-------------+---------------+---------+------------+
| 6 | 919 | 1 | INGLES I | 10 | 90 | 2010-10-20 |
| 6 | 919 | 1 | MATEMATICAS | 11 | NULL | 2010-10-20 |
| 7 | 212 | 1 | INGLES I | 10 | 88 | 2010-10-20 |
| 7 | 212 | 1 | MATEMATICAS | 11 | NULL | 2010-10-20 |
| 8 | 818 | 1 | MATEMATICAS | 11 | NULL | 2010-09-20 |
| 8 | 818 | 1 | INGLES I | 10 | NULL | 2010-09-20 |
+------+-----------+-------------+-------------+---------------+---------+------------+
6 rows in set (0.00 sec)
Ahora hago tu magica consult a a MARIA y.....
mysql> select k.fechacalif, a.apellidos, a.nombres as nombreAlumno, m.materia as nombreMateria, ifnull( k.calif1A, 'NO CALIFICADO') as Materia from materias m left outer join kardex k on m.codigomateria = k.codigomateria left outer join alumnos a on k.matricula = a.matricula where k.matricula = 100 or k.matricula is null;
+------------+-----------+--------------+---------------------------+---------------+
| fechacalif | apellidos | nombreAlumno | nombreMateria | Materia |
+------------+-----------+--------------+---------------------------+---------------+
| NULL | NULL | NULL | taller de redaccion I | NO CALIFICADO |
| NULL | NULL | NULL | metodologia de la lectura | NO CALIFICADO |
| NULL | NULL | NULL | historia moderna | NO CALIFICADO |
+------------+-----------+--------------+---------------------------+---------------+
Bingo ;-)
Ahora quieres saber porque ocurrio esto??? Pues precisamente chico porque MARIA solo existe en la tabla Alumnos y Materias ;) sin embargo tu haces la comparaciones con Kardex.. pero como esta alumna NO tiene nada en Kardex... como va a retonarte las calificaciones que se reflejan en la tabla Kardex???? Si no existen datos de ningun tipo de ella en Kardex???? Sin embargo si existen datos de ella en la tabla Materia y Alumnos... Recuerdate que el campo
calif1A esta en la tabla Kardex y es ese campo o sea mira tu consulta SQL dice:
Citarm.codigomateria = k.codigomateria
O sea las materias que esten en la tabla Kardex que concuerden con las materias que esten en la tabla Materias... pero si tu no tienes registros de algun alumno en la tabla Kardex... como quieres que te retorne las materias que estan ahi dentro???
O sea ya que solamente tienes datos en la tabla Alumnos y Materias para el caso mostrado tu comparacion de tu consulta dice:
Citareft outer join alumnos a on k.matricula = a.matricula
Pero... k.matricula pertenece a la tabla Kardex no??? y si Kardex no tiene registros aca para dicho alumno... que va a retornarte para la calificacion??
Nada (Que es lo que esta pasando).
Tendras que agregar 1 campo extra en la tabla Materias para que puedas relacionar las materias con alumnos
sin que estas esten obligatoriamente en Kardex... o registrar datos en la tabla Kardex para todos los alumnos aunque el valor
sea null.
:D
entonces seria factible agregar a la tabla materias tambien el numero de matricula ? se resuelve la bronca ?
Sip asi se resuelve royer pero tendrias que hacerle un ligero cambio a tu consulta SQL para que funcione si haces eso ;)
O tambien puedes tambien hacer esto:
select k.fechacalif, a.apellidos, a.nombres as nombreAlumno, m.materia as nombreMateria, ifnull( k.calif1A, 'NO CALIFICADO') as Materia from materias m left outer join kardex k on m.codigomateria = k.codigomateria join alumnos a on a.matricula = 100 and k.calif1A is null;
Sustituyendo la matricula al final (la que apunta a alumnos) por el numero de Matricula del alumno que NO tiene registros en la tabla Kardex.