Consultas múltiples con PHP+MySQL

Necesito hacer una búsqueda en varias tablas en una BD. No logro hacerlo y he probado lo siguiente:
$sql="SELECT articulos.ArticulosID as articulosid,articulos.Titulo as articulostitulo,glosario.GlosarioID as glosarioid,glosario.Palabra as glosariopalabra,glosario.Definicion as glosariodefinicion FROM articulos,glosario WHERE articulos.Titulo LIKE '$palabra%' or glosario.Palabra LIKE '$palabra%'";
Te explico un poco. Tengo 2 tablas, artículos y glosario. La idea es buscar en esas 2 una palabra que introduce alguien desde un formulario. Viene a ser algo así como un buscador.
Pongo los AS porque me encontré con el problema de que al hacer el echo $row["campo"] no sabia como referirme al campo de una tabla en concreto. Probé todo tipo de cosas $row. Tabla, $row["campo.tabla"] etc. La cosa es que con el AS ya puedo referirme, pero esa consulta en concreto no se que le pasa pero se me repiten los campos encontrados, y se repiten una barbaridad, pero encontrarlos los encuentra.
Se que hay formas mejores de hacer todo esto pero me gustaría tener en $result todo el resultado junto, es decir, todo lo encontrado en glosario y artículos ya que luego voy a usar el limit para avanzar y retroceder en la búsqueda encontrada, y si tengo que hacer varias consultas me voy a hacer un lio.
Como te comento solo tengo el problema de que se repiten los resultados en esa consulta que te pegué.

4 respuestas

Respuesta
1
Proba poner la palabra clave
DISTINCT
Despues del Select, eso deberia sacarte los registros repetidos, sino trata de ver la consulta, seguramente estas buscando cosas ambiguas, cualquier cosa consultame.
Respuesta
1
Se te repiten tantas veces el resultado porque la consulta que has hecho es un producto cartesiano de dos tablas, es decir, si una tabla tiene n registros y la otra tiene m, el resultado es una tabla con nxm registros.
Primero: ¿Existe algún campo (clave externa) que relacione la tabla artículos con la tabla glosario?
Si no es así, tendrás que hacer 2 consultas por separado o te ocurrirá esto.
Si existe este campo, por ejemplo si esta en la tabla articulos y se llama idglosario, deberas incluir en el where esta condicion: articulos.glosarioid=glosario.glosarioID
Gracias por tu rápida respuesta choogal.
No existe tal campo entre glosario y artículos.
Si no es posible de hacer todo esto de la forma que te comenté tendré que hacerlo individual como me has comentado. Crees que se podria hacer con join y left? No se muy bien como funciona pero creo que he leído algo sobre eso.
En todo caso, si finalmente lo hago como tu dices, ¿alguna recomendación a seguir para hacer 2 consultas y mostrarlas en una web como si de una sola se tratase y que ademas tenga los botones de avanzar y retroceder?
Gracias una vez más
Con join y left seguirias teniendo al mismo problema pues necesitas que estas dos tablas esten relacionadas.
Haz una consulta a una tabla y vuelca el resultado en un array, luego haz la otra consulta con la otra tabla y vuelca el resultado en el mismo array, pero a continuación, así obtendrás un array con el resultado de las dos consultas, que es lo que quieres obtener.
Respuesta
1
El problema esta en que la consulta siempre te dará un resultado extenso y repetido por lo siguiente:
en el where le indicas que te saque todos los resultado cuando articulos.Titulo LIKE '$palabra%' or glosario.Palabra LIKE '$palabra%';
El problema esta en el "or" porque con solo que encuantre la palabra en una de las 2 tablas te sacara resultados no deseados de la otra tabla.
Supongo que tu lo que necesitas es sacar los resultados deseados de cada tabla, así que no te queda más remedio que estrugarte un poco; pero te voy a indicar como.
La cuestión para tener todo organizado es meterlo en un vector.
Cuando empiece el código preguntaras con un if si en los elementos del vector es mayor que 0. Si tiene más de cero elementos significa que ya has metido los resultados en el vector. Y si no deberás ejecutar 2 consultas diferentes, 1 por cada tabla.
Guarda los resultados de cada consulta en un mismo vector.
Para conseguir el mismo efecto que el limit deberás mediante un for() mostrar los resultados que quieras a partir del que quieras.
Para conseguir que el vector no se salga de rango el el for tendrás antes que comprobar que el numero de elementos del vector es >= $limit + el numero de resultados que quieres mostrar y si es menor resta el $limit al numero total de elementos del vector y ese sera el nº de elementos que mostraras en el for.
Para terminar te preguntaras como haces para mantener el vector con los mismos resultados sin tener que recargarlo cada vez.
Lo harás metiéndolo en un campo dentro de un formulario que llamara a la misma página.
Para poder hacerlo, antes de meter la variable en el campo deberás:
$vector = serialize($vector);
$vector = urlencode($vector);
Para recuperarlo una vez que reenvies el formulario deberas:
$vector = urldecode($vector);
$vector = unserialize($vector);
Como es algo complicado, si no lo entiendes, valórame esta pregunta y en otra que me hagas te envío el código con comentarios para que no tengas dudas y te salgas sin problemas.
Respuesta
Tienes mal el concepto de la sentencia SQL. Si las dos tablas no se relacionan por ningún campo, entonces no puedes una búsqueda como la que estás haciendo y deberías hacer una para cada tabla diferente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas