Ayuda con Consulta.

Iniciado por royerphpmysql, 19 Marzo 2010, 22:16 PM

0 Miembros y 1 Visitante están viendo este tema.

royerphpmysql

hola gente buen dia com estan.
me surgio una gran duda y pido de su asesoria, tengo la siguiente consulta.

Código (php) [Seleccionar]


$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.

Código (php) [Seleccionar]

$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



Skeletron

Y estas seguro quue ya calificó?

royerphpmysql

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..

^Tifa^

#63
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


royerphpmysql

HOLA TIFA muchas gracias por tu ayuda, aqui te muestro las estructuras de las tablas.
son, alumnos, kardex y materias.

Código (dos) [Seleccionar]

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

^Tifa^

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:

Código (sql) [Seleccionar]


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):

Código (sql) [Seleccionar]


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...

royerphpmysql

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


^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.


royerphpmysql

en la tabla materias tengo almacenado lo siguiente:
Código (dos) [Seleccionar]


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.. ;)

^Tifa^

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:

Código (sql) [Seleccionar]


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):

Código (sql) [Seleccionar]


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.....

Código (sql) [Seleccionar]


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