Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: royerphpmysql en 19 Marzo 2010, 22:16 pm



Título: Ayuda con Consulta.
Publicado por: royerphpmysql en 19 Marzo 2010, 22:16 pm
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


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 19 Marzo 2010, 23:16 pm
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


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 19 Marzo 2010, 23:46 pm
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.


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 00:09 am
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


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 00:31 am
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.


Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 20 Marzo 2010, 00:42 am
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...



Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 00:45 am
Podria solucionarce con un RIGHT JOIN...


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 00:48 am
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 ;)


Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 20 Marzo 2010, 00:49 am
Citar
Podria 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...


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 01:08 am
otravez muchas gracias TIFA me tendre que ir al foro de PHP jajaja sludos


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 01:16 am
Citar
Podria 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;


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 01:27 am
Código
  1. mysql> SELECT alumnos.nombre, alumnos.apellido, materias.matricula, materias.calificacion FROM alumnos NATURAL RIGHT JOIN materias GROUP BY matricula;
  2. +--------+----------+-----------+--------------+
  3. | nombre | apellido | matricula | calificacion |
  4. +--------+----------+-----------+--------------+
  5. | Noel   | Broda    |         1 |           10 |
  6. | Tiffa  | Perez    |         2 |            9 |
  7. +--------+----------+-----------+--------------+
  8. 2 ROWS IN SET (0.02 sec)
  9.  
  10.  
  11.  
  12. mysql> SELECT * FROM materias;
  13. +-----------+--------------+
  14. | matricula | calificacion |
  15. +-----------+--------------+
  16. |         1 |           10 |
  17. |         2 |            9 |
  18. |         2 |            8 |
  19. |         1 |            6 |
  20. +-----------+--------------+
  21. 4 ROWS IN SET (0.00 sec)
  22.  
  23.  
  24.  


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?


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 01:33 am
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


Título: Re: Ayuda con Consulta.
Publicado por: seba123neo en 20 Marzo 2010, 01:47 am
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.


Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 20 Marzo 2010, 01:48 am
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:


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 01:55 am
 :-( 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


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 02:13 am
No es tan dificil...

Código
  1. SELECT alumnos.nombre, alumnos.apellido, alumnos.matricula,
  2. kardex.calificacion, kardex.codigomateria
  3. FROM alumnos, kardex
  4. WHERE kardex.matricula=alumnos.matricula");
  5.  
  6. $row=mysql_fetch_array($res) //hago esto, para poder tomar el nombre antes de entrar al WHILE.
  7.  
  8. echo 'El alumno '.$row['apellido'].' '.$row['nombre'].' de matricula: '.$row[matricula].' obtuvo las siguiente calificaciones:</br>';
  9.  
  10. echo 'Codigo de Materia: '.$row['codigomateria'].' | Calificacion: '.$row['calificacion'].'</br>';
  11.  
  12. while($row=mysql_fetch_array($res)){
  13.  
  14.   echo 'Codigo de Materia: '.$row['codigomateria'].' | Calificacion: '.$row['calificacion'].'</br>';
  15.  
  16. }


Dime si te funcionó.. Que lo hice aca sin ningun IDE


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 02:15 am
Si no entiendes el codigo, me dices y te lo explico paso por paso


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 02:30 am
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..


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 02:39 am
<?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


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 02:56 am
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


Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 20 Marzo 2010, 03:13 am
Gracias a Skeletron por aportar codigo funcional  ;)   ;)   ;)


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 03:19 am
Perfecto tio...
Cualquier otra cosita, grita! :)


Cya!!


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 05:04 am
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&uacute; Principal </a></h3>
     <p>&nbsp;</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.



Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 05:19 am
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


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 14:57 pm
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:
Código
  1. // Obtener datos
  2. $matricula= $_REQUEST['matricula'];
  3.  
  4.       $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í:

      
Código
  1. $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í:

Código
  1. $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


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 17:30 pm
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.


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 17:43 pm
no viene adjunto el codigo de las 2 post anteriores tuyos.


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 20:35 pm
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í:

Código
  1. $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']);
  2.  
  3. $row=mysql_fetch_array($res) //hago esto, para poder tomar el nombre antes de entrar al WHILE.
  4.  
  5. echo 'El alumno '.$row['apellido'].' '.$row['nombre'].' de matricula: '.$row[matricula].' obtuvo las siguiente calificaciones:</br>';
  6.  
  7. echo 'Codigo de Materia: '.$row['codigomateria'].' | Calificacion: '.$row['calificacion'].'</br>';
  8.  
  9. while($row=mysql_fetch_array($res)){
  10.  
  11.   echo 'Codigo de Materia: '.$row['codigomateria'].' | Calificacion: '.$row['calificacion'].'</br>';
  12.  
  13. }
  14.  
  15.  


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 20:51 pm
yessss muchas gracias señor ya pude...


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 21:23 pm
Perfecto...

Entendes bien el codigo? o queres que te lo explique (así aprendes un poquito mas de php)


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 21:35 pm
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


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 21:50 pm
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:


Código
  1. $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']);
  2.  
  3. $row=mysql_fetch_array($res) //hago esto, para poder tomar el nombre antes de entrar al WHILE.
  4.  
  5. echo 'El alumno '.$row['apellido'].' '.$row['nombre'].' de matricula: '.$row[matricula].' obtuvo las siguiente calificaciones:</br>';
  6.  
  7. echo '<table>';
  8. echo '<tr>';
  9. echo '<td><b>Codigo de Materia</b></td><td><b>Calificacion</b></td>';
  10. echo '</tr>';
  11.  
  12. echo '<tr>';
  13.   echo '<td>'.$row['codigomateria'].'</td><td>'.$row['calificacion'].'</td>';
  14. echo '</tr>';
  15.  
  16. while($row=mysql_fetch_array($res)){
  17.  
  18. echo '<tr>';
  19.   echo '<td>'.$row['codigomateria'].'</td><td>'.$row['calificacion'].'</td>';
  20. echo '</tr>';
  21.  
  22. }
  23. echo '</table>';
  24.  


Lo pruebas y dices si funcionó


Si no sabes como agregarle FECHA DE CALIFICACION, me dices, y modifico éste mismo post con el agregado


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 22:07 pm
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?


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 22:11 pm
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


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 22:21 pm
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..


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 22:23 pm
Si... Has eso.. Has eso con la otra tabla MATERIAS... Liga otra tbala mas :)


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 22:27 pm
muchisimas gracias MASTER dejame le echo ganas y hay te informo para si se me atora la carreta, gracias


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 22:33 pm
de nada tio..
Pasate cuando quieras :)


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 23:23 pm
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


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 20 Marzo 2010, 23:43 pm
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


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 20 Marzo 2010, 23:53 pm
ok muchas gracias MASTER.... hola TIFFA andas por alli D: gracias por todo el apoyo amigos..


Título: Re: Ayuda con Consulta.
Publicado por: 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


Título: Re: Ayuda con Consulta.
Publicado por: seba123neo en 22 Marzo 2010, 03:10 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:

Código:
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.


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 22 Marzo 2010, 04:28 am
muchas gracias  seba123neo   :xD


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 22 Marzo 2010, 21:50 pm
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


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 23 Marzo 2010, 03:51 am
Sería algo así como un LEFT JOIN que sea NULL..

materias left join kardex on xxxxx where xxxx is null

Algo así...


Título: Re: Ayuda con Consulta.
Publicado por: 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?


Título: Re: Ayuda con Consulta.
Publicado por: seba123neo en 24 Marzo 2010, 02:32 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.


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 24 Marzo 2010, 04:11 am
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
 



Título: Re: Ayuda con Consulta.
Publicado por: seba123neo en 24 Marzo 2010, 17:45 pm
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

Citar
codigomateria              nombre

1                              Matematicas
2                              Fisica
3                              Quimica
4                              Literatura
5                              Geografia
6                              Etica
7                              Filosofia
8                              Computacion




TABLA ALUMNOS

Citar
matricula    nombre

111   Sebastian
222   Tifa
333   Skeletron



TABLA KARDEX

Citar
matricula       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:

Código
  1. SELECT a.nombre AS nombreAlumno,m.nombre AS nombreMateria,IFNULL(k.calificacion,'NO CALIFICADO') AS calificacion
  2. FROM materias m
  3. LEFT OUTER JOIN kardex k ON m.codigomateria=k.codigomateria
  4. LEFT OUTER JOIN alumnos a ON k.matricula=a.matricula
  5. 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.


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 25 Marzo 2010, 00:42 am
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


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 27 Marzo 2010, 03:50 am
Código
  1. consulta SQL:  
  2.  
  3. SELECT a.nombres AS nombreAlumno, m.materia AS nombreMateria, IFNULL( k.calif1A, 'NO CALIFICADO' ) AS calif1A
  4. FROM materias m
  5. LEFT OUTER JOIN kardex k ON m.codigomateria = k.codigomateria
  6. LEFT OUTER JOIN alumnos a ON k.matricula = a.matricula
  7. WHERE k.matricula = '91901014430'
  8. OR k.matricula IS NULL
  9. LIMIT 0 , 30
  10.  
  11. MySQL ha dicho:  
  12.  
  13. #1267 - #1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (latin1_spanish_ci,IMPLICIT) for operation '='
  14.  
  15.  
  16.  

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


Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 27 Marzo 2010, 04:30 am
(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..


Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 27 Marzo 2010, 05:52 am
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


Título: Re: Ayuda con Consulta.
Publicado por: seba123neo en 27 Marzo 2010, 15:09 pm
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.


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 28 Marzo 2010, 00:19 am
Código
  1. @mysql_query("SET collation_connection = latin1_spanish_ci;");
  2.  
  3. $res=mysql_query("SELECT a.nombres AS nombreAlumno, m.materia AS nombreMateria, IFNULL( k.calif1A, 'NO CALIFICADO' ) AS calif1A
  4. FROM materias m
  5. LEFT OUTER JOIN kardex k ON m.codigomateria = k.codigomateria
  6. LEFT OUTER JOIN alumnos a ON k.matricula = a.matricula WHERE k.matricula = ".$_POST['matricula']);
  7.  
  8.  
  9. $row=mysql_fetch_array($res);
  10.  

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


Título: Re: Ayuda con Consulta.
Publicado por: seba123neo en 28 Marzo 2010, 01:43 am
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...


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 28 Marzo 2010, 03:20 am
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 ;(


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 28 Marzo 2010, 07:46 am
gracias a todos por su ayudaya logre mi objetivo..

dios los bendiga a todos


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 24 Abril 2010, 00:33 am
hola gente buen dia com estan.
me surgio una gran duda y pido de su asesoria, tengo la siguiente consulta.

Código
  1.  
  2. $res=mysql_query("SELECT k.fechacalif, a.apellidos, a.nombres AS nombreAlumno, m.materia AS nombreMateria, IFNULL( k.calif1A, 'NO CALIFICADO' ) AS calif1A
  3. FROM materias m
  4. LEFT OUTER JOIN kardex k ON m.codigomateria = k.codigomateria
  5. LEFT OUTER JOIN alumnos a ON k.matricula = a.matricula
  6. WHERE k.matricula =".$_POST['matricula']." OR k.matricula IS NULL");
  7.  

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
  1. $res=mysql_query("SELECT k.fechacalif, a.apellidos, a.nombres AS nombreAlumno, m.materia AS nombreMateria, IFNULL( k.calif1A, 'NO CALIFICADO' ) AS calif1A
  2. FROM materias m
  3. LEFT OUTER JOIN kardex k ON m.codigomateria = k.codigomateria
  4. LEFT OUTER JOIN alumnos a ON k.matricula = a.matricula
  5. WHERE k.matricula =".$_POST['matricula']." OR k.matricula IS NULL");
  6.  
  7.  
  8. $row=mysql_fetch_array($res); //hago esto, para poder tomar el nombre antes de entrar al WHILE.
  9.  
  10. echo '<tr>';
  11.    echo '<td><b>';
  12.    echo '</td></b>';
  13. echo '</tr>';
  14. echo "<ul> </ul>";
  15.    echo "<td><div align=left>El alumno <b>".$row['nombreAlumno']." ".$row['apellidos']."</b>  con  Matricula: <b>".$_POST[matricula];
  16.    echo "<td><div align=left></b>Tiene las Siguientes Calificaciones </a></div></td></br>";
  17. echo '<table>';
  18. echo '<tr>';
  19. echo '<td><div align=center><b>Materia</b></td><td><b>Calificacion</b><td><b>Fecha Calificacion</b></td>';
  20. echo '</tr>';
  21. echo '<tr>';
  22. echo '<td><div align=center>'.$row['nombreMateria'].'</td><td><div align=center>'.$row['calif1A'].'</td><td><div align=center>'.$row['fechacalif'].'</td>';
  23. echo '<td>';
  24. while($row=mysql_fetch_array($res))
  25. {
  26. echo '<tr>';
  27. echo '<td><div align=center>'.$row['nombreMateria'].'</td><td><div align=center>'.$row['calif1A'].'</td><td><div align=center>'.$row['fechacalif'].'</td></div>';
  28. echo '</tr>';
  29. echo '<td>';
  30. }
  31. echo '</table>';
  32.  

gracias por su ayuda




Título: Re: Ayuda con Consulta.
Publicado por: Skeletron en 24 Abril 2010, 00:42 am
Y estas seguro quue ya calificó?


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 24 Abril 2010, 02:15 am
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..


Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 25 Abril 2010, 01:24 am
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:

Citar
IFNULL( 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



Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 25 Abril 2010, 03:29 am
HOLA TIFA muchas gracias por tu ayuda, aqui te muestro las estructuras de las tablas.
 son, alumnos, kardex y materias.

Código
  1. mysql> describe alumnos;
  2. +--------------+-------------+------+-----+---------+----------------+
  3. | Field        | Type        | Null | Key | Default | Extra          |
  4. +--------------+-------------+------+-----+---------+----------------+
  5. | id           | int(11)     | NO   | PRI | NULL    | auto_increment |
  6. | matricula    | bigint(14)  | NO   |     | NULL    |                |
  7. | nombres      | varchar(50) | NO   |     | NULL    |                |
  8. | apellidos    | varchar(50) | NO   |     | NULL    |                |
  9. | carrera      | varchar(40) | NO   |     | NULL    |                |
  10. | fechaingreso | date        | NO   |     | NULL    |                |
  11. | turno        | varchar(20) | NO   |     | NULL    |                |
  12. | grupo        | varchar(10) | NO   |     | NULL    |                |
  13. | salon        | int(11)     | NO   |     | NULL    |                |
  14. +--------------+-------------+------+-----+---------+----------------+
  15. 9 rows in set (0.00 sec)
  16.  
  17. mysql> describe kardex;
  18. +-------------------+---------------------+------+-----+---------+------------
  19. --+
  20. | Field             | Type                | Null | Key | Default | Extra
  21.  |
  22. +-------------------+---------------------+------+-----+---------+------------
  23. --+
  24. | id                | int(10) unsigned    | NO   | PRI | NULL    | auto_increm
  25. t |
  26. | matricula         | bigint(14) unsigned | NO   |     | NULL    |
  27.  |
  28. | tetramestre       | int(10) unsigned    | NO   |     | NULL    |
  29.  |
  30. | materia           | varchar(45)         | YES  |     | NULL    |
  31.  |
  32. | codigomateria     | varchar(10)         | NO   |     | NULL    |
  33.  |
  34. | catedratico       | varchar(80)         | NO   |     | NULL    |
  35.  |
  36. | codigocatedratico | varchar(10)         | NO   |     | NULL    |
  37.  |
  38. | calif1A           | int(10) unsigned    | NO   |     | NULL    |
  39.  |
  40. | fechacalif        | varchar(10)         | NO   |     | NULL    |
  41.  |
  42. | calif2A           | int(10) unsigned    | YES  |     | NULL    |
  43.  |
  44. | fechasegundaop    | varchar(10)         | YES  |     | NULL    |
  45.  |
  46. | califrevalidacion | int(10) unsigned    | YES  |     | NULL    |
  47.  |
  48. | fechasegopesp     | varchar(10)         | YES  |     | NULL    |
  49.  |
  50. | califrecuperacion | int(10) unsigned    | YES  |     | NULL    |
  51.  |
  52. | fechacalifrec     | varchar(10)         | YES  |     | NULL    |
  53.  |
  54. | califespecial     | int(10) unsigned    | YES  |     | NULL    |
  55.  |
  56. | fechacalifesp     | varchar(10)         | YES  |     | NULL    |
  57.  |
  58. +-------------------+---------------------+------+-----+---------+------------
  59. --+
  60. 17 rows in set (0.02 sec)
  61.  
  62. mysql> describe materias;
  63. +-------------------+------------------+------+-----+---------+-------+
  64. | Field             | Type             | Null | Key | Default | Extra |
  65. +-------------------+------------------+------+-----+---------+-------+
  66. | codigomateria     | varchar(10)      | NO   | PRI | NULL    |       |
  67. | materia           | varchar(255)     | NO   |     | NULL    |       |
  68. | carrera           | varchar(3)       | NO   |     | NULL    |       |
  69. | tetra             | int(10) unsigned | NO   |     | NULL    |       |
  70. | codigocatedratico | varchar(10)      | NO   |     | NULL    |       |
  71. +-------------------+------------------+------+-----+---------+-------+
  72. 5 rows in set (0.00 sec)
  73.  
  74. mysql>
  75.  
  76.  

gracias por tu valioso apoyo..

rogelio


Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 25 Abril 2010, 20:55 pm
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
  1.  
  2. mysql> SELECT * FROM kardex;                                                                                                        +------+-----------+-------------+--------------+---------------+                                                                  
  3. | id   | matricula | materia     | calificacion | codigomateria |                                                                  
  4. +------+-----------+-------------+--------------+---------------+
  5. |    1 |       200 | matematica  |           80 | matematica    |
  6. |    2 |       300 | lenguaje    |         NULL | lenguaje      |
  7. |    3 |       400 | historia    |           70 | historia      |
  8. |    4 |       500 | matematicax |         NULL | matematicax   |
  9. |    5 |       600 | lenguajex   |           87 | lenguajex     |
  10. +------+-----------+-------------+--------------+---------------+
  11. 5 ROWS IN SET (0.00 sec)
  12.  
  13. mysql> SELECT * FROM alumnos;
  14. +------+-----------+---------+-----------+--------------+
  15. | id   | matricula | nombres | apellidos | fechaingreso |
  16. +------+-----------+---------+-----------+--------------+
  17. |    1 |       200 | Jose    | Perez     | NULL         |
  18. |    2 |       300 | Mario   | Lopez     | NULL         |
  19. |    3 |       400 | Gloria  | Mar       | NULL         |
  20. |    4 |      NULL | Pepe    | Martinez  | NULL         |
  21. |    5 |      NULL | Carlos  | Manuel    | NULL         |
  22. +------+-----------+---------+-----------+--------------+
  23. 5 ROWS IN SET (0.00 sec)
  24.  
  25.  

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
  1.  
  2. 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;                                                                                                                                  
  3. +-----------+--------------+---------------+---------------+                                                                        
  4. | apellidos | nombreAlumno | nombreMateria | Califica      |                                                                        
  5. +-----------+--------------+---------------+---------------+                                                                        
  6. | Lopez     | Mario        | lenguaje      | NO CALIFICADO |                                                                        
  7. | NULL      | NULL         | matematicax   | NO CALIFICADO |                                                                        
  8. | NULL      | NULL         | lenguajex     | 87            |                                                                        
  9. +-----------+--------------+---------------+---------------+                                                                        
  10. 3 ROWS IN SET (0.00 sec)    
  11.  
  12. 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;                                                                                                                                  
  13. +-----------+--------------+---------------+---------------+                                                                        
  14. | apellidos | nombreAlumno | nombreMateria | Califica      |                                                                        
  15. +-----------+--------------+---------------+---------------+                                                                        
  16. | Perez     | Jose         | matematica    | 80            |                                                                        
  17. | NULL      | NULL         | matematicax   | NO CALIFICADO |                                                                        
  18. | NULL      | NULL         | lenguajex     | 87            |                                                                        
  19. +-----------+--------------+---------------+---------------+                                                                        
  20. 3 ROWS IN SET (0.00 sec)                            
  21.  
  22.  

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


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 26 Abril 2010, 01:31 am
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



Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 26 Abril 2010, 01:54 am
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.



Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 26 Abril 2010, 02:08 am
en la tabla materias tengo almacenado lo siguiente:
Código
  1.  
  2. mysql> select * from materias;
  3. +---------------+--------------------------------+---------+-------+------------
  4. -------+
  5. | codigomateria | materia                        | carrera | tetra | codigocated
  6. ratico |
  7. +---------------+--------------------------------+---------+-------+------------
  8. -------+
  9. | 10            | INGLES I                       |         |     0 | C1
  10.       |
  11. | 11            | MATEMATICAS I                  |         |     0 | C1
  12.       |
  13. | 12            | TALLER DE REDACCION I          |         |     0 | C1
  14.       |
  15. | 13            | METODOLOGIA DE LA LECTURA      |         |     0 | C1
  16.       |
  17. | 14            | HISTORIA MODERNA   |         |     0 | C1
  18.  
  19.  

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


Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 26 Abril 2010, 04:04 am
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
  1.  
  2. mysql> SELECT * FROM alumnos;
  3. +------+-----------+---------+-----------+---------+--------------+-------+--------+-------+
  4. | id   | matricula | nombres | apellidos | carrera | fechaingreso | turno | grupo  | salon |
  5. +------+-----------+---------+-----------+---------+--------------+-------+--------+-------+
  6. |    6 |       919 | PEPE    | TONO      | PREPA   | 0000-00-00   | TARDE | GRUPO1 |     1 |
  7. |    7 |       212 | PANCHO  | PEREZ     | PREPA   | 0000-00-00   | TARDE | GRUPO2 |     1 |
  8. |    9 |       100 | MARIA   | LOPEZ     | NULL    | NULL         | TARDE | GRUPO1 |     1 |
  9. +------+-----------+---------+-----------+---------+--------------+-------+--------+-------+
  10.  
  11.  
  12.  

Pero no le agregue absolutamente nada en Kardex a este nuevo usuario (QUe es MARIA LOPEZ):

Código
  1.  
  2. mysql> SELECT * FROM kardex;
  3. +------+-----------+-------------+-------------+---------------+---------+------------+
  4. | id   | matricula | tetramestre | materia     | codigomateria | calif1A | fechacalif |
  5. +------+-----------+-------------+-------------+---------------+---------+------------+
  6. |    6 |       919 | 1           | INGLES I    |            10 |      90 | 2010-10-20 |
  7. |    6 |       919 | 1           | MATEMATICAS |            11 |    NULL | 2010-10-20 |
  8. |    7 |       212 | 1           | INGLES I    |            10 |      88 | 2010-10-20 |
  9. |    7 |       212 | 1           | MATEMATICAS |            11 |    NULL | 2010-10-20 |
  10. |    8 |       818 | 1           | MATEMATICAS |            11 |    NULL | 2010-09-20 |
  11. |    8 |       818 | 1           | INGLES I    |            10 |    NULL | 2010-09-20 |
  12. +------+-----------+-------------+-------------+---------------+---------+------------+
  13. 6 ROWS IN SET (0.00 sec)
  14.  
  15.  

Ahora hago tu magica consult a a MARIA  y.....

Código
  1.  
  2. 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;
  3. +------------+-----------+--------------+---------------------------+---------------+
  4. | fechacalif | apellidos | nombreAlumno | nombreMateria             | Materia       |
  5. +------------+-----------+--------------+---------------------------+---------------+
  6. | NULL       | NULL      | NULL         | taller de redaccion I     | NO CALIFICADO |
  7. | NULL       | NULL      | NULL         | metodologia de la lectura | NO CALIFICADO |
  8. | NULL       | NULL      | NULL         | historia moderna          | NO CALIFICADO |
  9. +------------+-----------+--------------+---------------------------+---------------+
  10.  
  11.  

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:

Citar
m.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:

Citar
eft 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


Título: Re: Ayuda con Consulta.
Publicado por: royerphpmysql en 26 Abril 2010, 04:16 am
entonces seria factible agregar a la tabla materias tambien el numero de matricula ? se resuelve la bronca ?


Título: Re: Ayuda con Consulta.
Publicado por: ^Tifa^ en 26 Abril 2010, 04:27 am
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:

Código
  1. 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;
  2.  
  3.  

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.