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

No logro hacer un buscador...

Estas en el tema de No logro hacer un buscador... en el foro de Mysql en Foros del Web. Saludos amigos del foro. Primero confieso que tengo poco tiempo en esto de la programación MySQL y tengo un proyecto que iba muy bien, hasta ...
  #1 (permalink)  
Antiguo 11/10/2006, 18:45
 
Fecha de Ingreso: mayo-2005
Mensajes: 55
Antigüedad: 19 años
Puntos: 1
No logro hacer un buscador...

Saludos amigos del foro.

Primero confieso que tengo poco tiempo en esto de la programación MySQL y tengo un proyecto que iba muy bien, hasta que me pidieron hacer un buscador general. Les explico el problema:

Tengo una BD con 7 tablas y necesito hacer una búsqueda en todas las tablas. Les digo cada tabla:

TABLA PRODUCCION (p)
IDproduccion
titulo
informacion

TABLA INTERPRETE (i)
IDartista
IDproduccion

TABLA ARTISTA (a)
IDartista
Nombre

TABLA PRODUCIDA (pda)
IDproduccion
IDproductor

TABLA PRODUCTOR (pr)
IDproductor
productor

TABLA COMPUESTA (cta)
IDcompositor
IDproduccion

TABLA COMPOSITOR (c)
IDcompositor
Apellido
Nombre

El asunto está en que la BÚSQUEDA debe buscar por:
p.titulo, p.informacion,
a.nombre,
pr.productor,
c.Apellido, c.Nombre

Yo hice el siguiente query y, funciona solo cuando relaciono PRODUCCION con dos tablas más, por ejemplo, PRODUCIDA y PRODUCTOR:

SELECT
p.IDproduccion, p.titulo, p.informacion, p.IDcategoria, p.lugar,
pda.IDproductor, pda.IDproduccion,
pr.IDproductor, pr.productor,
FROM
produccion p, producida pda, productor pr
WHERE
(pr.IDproductor=pda.IDproductor and pda.IDproduccion=p.IDproduccion)
and (p.titulo like '%$p_search_g%' or p.informacion like '%$p_search_g%' or pr.productor like '%$p_search_g%')
ORDER BY
p.IDproduccion asc

Ahora bien, cuando hago lo siguiente, viene el problema, se tarda demasiado y colapso el servidor:

SELECT
p.IDproduccion, p.titulo, p.informacion, p.IDcategoria, p.lugar,
pda.IDproductor, pda.IDproduccion,
pr.IDproductor, pr.productor,
a.IDartista, a.Nombre,
i.IDproduccion
FROM
produccion p, producida pda, productor pr, artista a, interprete i
WHERE
(pr.IDproductor=pda.IDproductor and pda.IDproduccion=p.IDproduccion and a.IDartista=i.IDartista and i.IDproduccion=p.IDproduccion)
and (p.titulo like '%$p_search_g%' or p.informacion like '%$p_search_g%' or pr.productor like '%$p_search_g%' or a.Nombre like '%$p_search_g%')
ORDER BY
p.IDproduccion asc

Estoy claro que debo estar cometiendo una BARBARIDAD en el modo de la búsqueda pero, honestamente, no se que hacer.

Bueno, espero haberles sido claro y espero (con mucha impaciencia) por una solución. Para que esten claros, tengo las siguientes versiones en el servidor:
PHP 4.4.3
MySQL 4.0.25

Muchas gracias.
  #2 (permalink)  
Antiguo 12/10/2006, 03:20
 
Fecha de Ingreso: octubre-2006
Mensajes: 36
Antigüedad: 17 años, 6 meses
Puntos: 0
No veo ninguna barbaridad en el codigo, tampoco tengo mucho conocimiento de tus tablas, como para saber si se puede reducir una condición.

Un consejo que te puedo dar, para asegurarte, es que las condiciones del WHERE coincidan con el orden de las tablas del FROM. En teoría esto filtraría cada tabla antes de hacer los JOIN, pero no estoy seguro de como funciona MYSQL en este aspecto.

También puedes probar a hacer INNER JOIN, aunque dependiendo de donde lo leas unos diran que van mejor que las condiciones del WHERE y otros peor.

Y como solucion desesperada, siempre puedes montar una tabla temporal que guarde el resultado de la select sin los LIKE (y sobre todo los OR que son los que deben ralentizar), y después eliminar los registros que no coincidan con lo que quieres recuperar, con lo que te quitarías los OR. Con esto puedes probar, si te va más rapido, pero tampoco es seguro

Vamos que solución fácil, fácil, no veo no.
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 17:24.