Autor
|
Tema: Ayuda con Consulta. (Leído 6,582 veces)
|
royerphpmysql
Desconectado
Mensajes: 64
que rico tequila.
|
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
|
|
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.686
A long way to go
|
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
|
|
|
|
|
En línea
|
|
|
|
royerphpmysql
Desconectado
Mensajes: 64
que rico tequila.
|
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.
|
|
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.686
A long way to go
|
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
|
|
|
|
|
En línea
|
|
|
|
royerphpmysql
Desconectado
Mensajes: 64
que rico tequila.
|
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.
|
|
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.802
|
+------------------+-------------+---------------+---------+ | nombres | matricula | codigomateria | calif1A | +------------------+-------------+---------------+---------+ | ALMANZA MAURICIO | 91901014429 | M10 | 80 | | | M11 | 90 | | | M12 | 69 | +------------------+-------------+---------------+---------+ Asi de antemano no lo puedes desplegar  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...
|
|
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.686
A long way to go
|
Podria solucionarce con un RIGHT JOIN...
|
|
|
|
|
En línea
|
|
|
|
royerphpmysql
Desconectado
Mensajes: 64
que rico tequila.
|
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 
|
|
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.802
|
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.  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...  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  y ahi retorna lo que buscas... pero en el caso del amigo en cuestion, creo que ya los registros estan totalmente filtrados como caen...
|
|
|
|
|
En línea
|
|
|
|
royerphpmysql
Desconectado
Mensajes: 64
que rico tequila.
|
otravez muchas gracias TIFA me tendre que ir al foro de PHP jajaja sludos
|
|
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.686
A long way to go
|
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.  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...  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  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;
|
|
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.686
A long way to go
|
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?
|
|
|
|
|
En línea
|
|
|
|
royerphpmysql
Desconectado
Mensajes: 64
que rico tequila.
|
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
|
|
|
|
|
En línea
|
|
|
|
|
seba123neo
|
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.
|
|
|
|
|
En línea
|
Mucha gente, especialmente la ignorante desea castigarte por decir la verdad, por ser correcto, por ser tú. Nunca te disculpes por ser correcto, o por estar años delante de tu tiempo. Si estas en lo cierto, y lo sabes, que hable tu razón. Incluso si eres una minoria de uno solo, la verdad sigue siendo la verdad. M. Gandhi
|
|
|
^Tifa^
Desconectado
Mensajes: 2.802
|
Por eso te decia desde un inicio Skeletron  no se podia de la manera que el lo desea  no lo tomes como un reclamo  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 
|
|
|
|
|
En línea
|
|
|
|
|
|