Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ayuda con esta consulta

Estas en el tema de Ayuda con esta consulta en el foro de Mysql en Foros del Web. Tengo las siguientes tablas Materias (id_materia,nombre,nivel) Grupos (id_grupo,semestre,aula,turno) Grupos_Materias(id_grupos_materias,id_grupo,id_mat eria) voy a explicarle como plantee mis tablas grupos_materias es la relacion de materias y grupos, ...
  #1 (permalink)  
Antiguo 20/06/2010, 20:24
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
Ayuda con esta consulta

Tengo las siguientes tablas

Materias (id_materia,nombre,nivel)

Grupos (id_grupo,semestre,aula,turno)

Grupos_Materias(id_grupos_materias,id_grupo,id_mat eria)

voy a explicarle como plantee mis tablas

grupos_materias es la relacion de materias y grupos, 1 grupo puede tener muchas materias, por ejemplo

el grupo 1 tiene los id_materia 1,2,3,4, el grupo 2 tiene los id_materia 1,5,6,7, etc.

mi problema es el siguiente, cuando quiero modificar los datos de la tabla grupos_materias, necesito que me traiga de las tablas materias las materias que no estan en la tabla grupos_materias dependiendo del grupo que yo escoja, por ejemplo

si mi grupo 1 tiene los id_materia 1,2,3 y en la tabla materia tengo los id_materia 1,2,3,4,5,6,7, por logica la consulta deberia traerme los id_materia 4,5,6,7 omitiendo asi los id_materia de la tabla grupos_materias, pero el problema esta en que no se como realizar la consulta, ayuda por favor

hago la siguiente consulta pero me trae todas las id_materia de la tabla materias

SELECT materias.id_materia,materias.nombre FROM materias,grupos_materias WHERE materias.id_materia<>grupos_materias.id_materia AND grupos_materias='1' GROUP BY materias.id_materia;

Última edición por negro1985; 20/06/2010 a las 21:27
  #2 (permalink)  
Antiguo 20/06/2010, 23:24
 
Fecha de Ingreso: junio-2010
Mensajes: 37
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con esta consulta

Primero que nada te falta hacer las relaciones a tu tabla y para eso tienes que cambiar tu sistema myisam a innodb (más informacion aqui
Código:
http://www.tufuncion.com/mysql-cluster
) mas sencillo de hacer eso es con SQLYOG,
  #3 (permalink)  
Antiguo 21/06/2010, 00:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con esta consulta

usando LEFT JOIN o una subconsulta o con NOT EXITS
con left join
SELECT * FROM Materias m LEFT JOIN Grupos_Materias g ON m.id_materia = gm.id_materia INNER JOIN grupos g ON g.id_grupo = gm.id_grupo WHERE g.id_grupo = @numerodegrupo AND gm.id_materia IS NULL

con subconsulta
SELECT id_materia, materia FROM materias WHERE id_materia IS NOT (SELECT id_materia FROM Grupos_Materias)

con NOT EXITS
SELECT DISTINCT id_materia FROM materias
WHERE NOT EXISTS (SELECT * FROM Grupos_materias
WHERE materias.id_materia= Grupos_materias.id_materia);

No he probado nada.
  #4 (permalink)  
Antiguo 21/06/2010, 10:53
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Ayuda con esta consulta

No hay algo un poco mas facil, se supone que ya hice la relacion mediante llaves foraneas, asi, no puedo haber materias en un grupo si el grupo no existe primero, y pore consecuencia no se puede agregar materias a un grupo si no existen materias, esas restricciones me las hacen las llaves foraneas, pero ahora como hago la consulta porque se supone que asi deberi poder hacer lo que quiero

Código PHP:
<?php
$id_grupo
=$_GET["id_grupo"];

$query="select materias.id_materia,materias.nombre from materias,grupos_materias,grupos where materias.id_materia<>grupos_materias.id_materia and grupos.id_grupo='$id_grupo' order by materias.nombre";
?>

Última edición por negro1985; 21/06/2010 a las 11:22
  #5 (permalink)  
Antiguo 21/06/2010, 14:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con esta consulta

A ver, la relación de integridad puedes controlarla con el motor InnoDB, pero con eso no sabrás qué materias de entre todas las existentes no han sido asignadas a un grupo determinado. Como te dije, no lo comprobé, pero las consultas que te puse debían proporcionarte esa información.
Vamos a lo que parece entenderse mejor, aunque sea menos eficiente:
SELECT id_materia, materia FROM materias WHERE id_materia IS NOT (SELECT id_materia FROM Grupos_Materias WHERE id_grupo = @numerogrupoquesea)
  #6 (permalink)  
Antiguo 21/06/2010, 21:59
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Ayuda con esta consulta

Lamento decirqte que tu consulta me marca error, y la verdad no se porque, ya le movi y todo pero nomas no me sale, alguna otra brilante idea antes de que me salgan canas verdes
  #7 (permalink)  
Antiguo 21/06/2010, 22:18
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con esta consulta

Perdona, te la puse mal. Debería ser así:
SELECT id_materia, materia FROM materias WHERE id_materia NOT IN (SELECT id_materia FROM Grupos_Materias WHERE id_grupo = @numerogrupoquesea)
  #8 (permalink)  
Antiguo 21/06/2010, 22:25
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Ayuda con esta consulta

Excelente amigo jurena, no tengo como agradecer tu ayuda, mil gracias, eres un genio, tengo un buen rato con mysql pero nunca se me habia presentado algo asi, gracias, jala de maravilla la consulta

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:44.