Ayuda con consulta en Mysql

dangerpaz

Bovino maduro
#1
Que tal amigos bakunos. necesito de su ayuda para resolver un problema en MySQL que me tiene el cerebro seco. Les cuento a grandes rasgos:

Tengo 3 tablas, que son TEMAS, ENLACES y RELACION_TEMA_ENLACE. Las dos primeras tienen su id como llave primaria, un nombre, una descripcion y algunos otros datos irrelevantes. la tercera tabla de relaciones tiene su id como llave primaria y referencia el id del enlace y el id del tema, ya que un enlace puede pertenecer a varios temas y un tema puede tener varios enlaces, es decir, era una relación muchos a muchos y por eso cree la tercera tabla para resolver dicho conflicto.
Hasta ahí todo bien, el problema surge cuando quiero hacer una consulta del tipo "Selecciona nombre y descripcion del enlace que pertenezcan al tema X" osea selecciona de las relaciones todos los ids de enlaces que tengan id de tematica X, y luego todos los ids de enlace que obtengas seleccionalos de la tabla enlace . Espero haberme explicado.

Dado que no se me ocurría una solución, seguí adelante y me surgió otro gran problema: La búsqueda. Dado que uso llaves foraneas en mis tablas, el motor de las mismas tenía que ser InnoDB.... ¡el cual no soporta FULLTEXT! (Cabe aclarar que FULLTEXT es el tipo de campo sobre el que se hacen búsquedas "avanzadas", no como el "LIKE") entonces la solución es mover todo, o al menos la tabla enlaces, a un motor MyISAM y resolver todas las dependencias con el programa, lo cual no quiero. ¿Alguna sugerencia para resolver eso?

Con que me den un norte de que debo hacer es suficiente. Tengo la idea de que usando JOINS logro lo que quiero, pero no se usarlos, por lo que si alguien me pudiera poner un ejemplo de joins estaría perfecto.
Saludos a todos y gracias por su apoyo.:)
 

AlxRex

Bovino maduro
#3
Tienes que hacer las convinaciones con el id deacuerdo a la relacion:
esto es un ejemplo.
Código:
SELECT t.*  (o puede ser t.nombre) , e.* (o puede ser e.nombre) FROM  RELACION_TEMA_ENLACE as rte
 LEFT JOIN TEMAS as t ON t.idTema = rte.idTema
LEFT JOIN ENLACES as e ON e.idEnlace = rte-idEnlace;
 

AlxRex

Bovino maduro
#4
Tienes que hacer las convinaciones con el id deacuerdo a la relacion:
esto es un ejemplo.
Código:
SELECT t.*  (o puede ser t.nombre) , e.* (o puede ser e.nombre) FROM  RELACION_TEMA_ENLACE as rte
 LEFT JOIN TEMAS as t ON t.idTema = rte.idTema
LEFT JOIN ENLACES as e ON e.idEnlace = rte.idEnlace;
 

Salandrews

Bovino maduro
#5
Supongamos las tablas así:

Tema
id_tema
nombre_tema
descripcion_enlace

Enlace
id_enlace
nombre_enlace
descripcion_enlace

Tema_Enlace
id_tema
id_enlace


La consulta es sencilla. Te piden los nombres y descripción de los enlaces. ¿Donde esta guardada esta información? En la tabla Enlace. Y te piden dicha información en base a un tema. ¿Donde esta la información que relaciona a los enlaces con los temas? en la tabla Tema_Enlace.

Supongamos que solicitas el tema con el id:xx.

La consulta sería:

select nombre_enlace,descripcion_enlace
from enlace,tema_enlace
where enlace.id_enlace=tema_enlace.id_enlace //join implícito
and tema_enlace.id_tema=xx

Con respecto a los motores, podes cambiar nada mas la tabla de enlaces a MyIsam. Si el campo sobre el que se hacen las búsquedas no lo soporta Innodb: o cambias esta tabla a MyIsam o cambias los tipos de datos de los campos de tu tabla a unos que si soporte Innodb.

Saludos
 

dangerpaz

Bovino maduro
#6
Gracias por sus respuestas!!! Les comento que ya pude resolver mi problema, haciendo algo como lo que pusiste Salandrews. En cuanto a la búsqueda usando índices FULLTEXT y motores InnoDB, lo que hice fué crear una tabla "espejo" con motor MyISAM, con los mismos campos que la tabla Inno. Además usé triggers, para asegurarme de la integridad referencial. Por ahorita es lo que les comento, en cuanto acabe mi proyecto me doy una vuelta para postear enlaces de interes y algunos ejemplos de lo que hice.
Gracias!
 
Arriba