Necesito hacer un QUERY de multiples tablas. Necesito hacer un LIKE '%$palabra%' con varios campos de varias tablas.
¿Puedo hacer esto en un solo QUERY? ¿Me pueden dar un ejemplo?
Muchas gracias.
![sonriente](http://static.forosdelweb.com/fdwtheme/images/smilies/smile.png)
| |||
![]() Saludos. Necesito hacer un QUERY de multiples tablas. Necesito hacer un LIKE '%$palabra%' con varios campos de varias tablas. ¿Puedo hacer esto en un solo QUERY? ¿Me pueden dar un ejemplo? Muchas gracias. ![]() |
| |||
Muchas gracias por contestar BRUJONIC. Mi Query es más complicado que eso. Tengo el siguiente código pero, al hacer la búsqueda se tarda demasiado. La base de datos tiene 2500 registros: "SELECT p.IDproduccion, p.titulo, p.informacion, p.IDcategoria, p.lugar, i.IDproduccion, i.IDartista, a.IDartista, a.Nombre, pda.IDproductor, pda.IDproduccion, pr.IDproductor, pr.productor FROM produccion p INNER JOIN (interprete i, artista a, producida pda, productor pr) ON (p.IDproduccion=i.IDproduccion AND i.IDartista=a.IDartista AND pr.IDproductor=pda.IDproductor AND pda.IDproduccion=p.IDproduccion) WHERE p.titulo like '%$palabra%' OR p.informacion like '%$palabra%' OR a.Nombre like '%$palabra%' OR pr.productor like '%$palabra%' ORDER BY p.IDproduccion asc" Parece que cae en un bucle. No sé. Muchas gracias por la ayuda que me puedas dar. |
| ||||
Claro que cae en un bucle, si llevaste un curso de BD o has leido, al realirzar un INNER JOIN, eso genera un resultado, o sea, genera una tabla temporal tomando como base el valor de producción. Aparte de eso, al concluir con ese proceso tan pesado, debe realizar un ORDER BY. Es por eso que te dura mucho tiempo... Como consejo, fijate en las tablas y relaciones para que cambies ese SELECT para eficientizarlo.
__________________ NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL |
| |||
Gracias BrujoNic. No veo como puedo hacer más eficaz el código. Realmente tengo como dos días en esto y no le encuentro la solución. Las tablas son: produccion IDproduccion titulo informacion interprete IDproduccion IDartista artista IDartista Nombre producida IDproduccion IDproductor productor IDproductor productor compuesta IDproduccion IDcompositor compositor IDcompositor Apellido Nombre Lo que necesito hacer es mostrar todos los registros en donde alguno de los campos (produccion.titulo, produccion.informacion, artista.Nombre, productor.productor, compositor.Apellido, compositor.Nombre) sea LIKE $palabra. Si tuvieras alguna solucion te lo agradecería muchísimo. Muchas gracias de nuevo. |
| ||||
podrias separar la consultas por cada tabla, es decir,en fves de hacer todo en un solo select, haces un select por tabla, de esa manera te ahorras el INNER JOIN. Ademas puedes suprimir el order by, ya que no e sun proceso liviano, y luego lo puedes ordenar ecuando ya tengas las consulatas realizadas.
__________________ http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux |
| |||
Y si hago un SELECT por tabla, ¿luego como le hago para mostrar todos los registros en una sola tabla? es decir, si me arroja resultados por cada SELECT, no sé como agruparlos todos los resultados y mostrarlos en una sola tabla. ¿Me explico? Estos son dos de mis SELECT: $sql1="SELECT IDproduccion, titulo, IDcategoria, productorart, lugar, isonido, fecha, deposito_legal, fuente, informacion FROM produccion WHERE informacion like '%$p_search_g%' or titulo like '%$p_search_g%'"; $sql2="SELECT i.IDproduccion, a.IDartista, a.Nombre, p.IDcategoria, p.titulo, p.informacion FROM artista a, interprete i, produccion p WHERE a.IDartista=i.IDartista and i.IDproduccion=p.IDproduccion AND a.Nombre like '%$p_search_g%'"; $result1 = mysql_query($sql1); $result2 = mysql_query($sql2); $result = // ¿cómo hago para unir $result1 con $result2 para poder mostrar los resultados? $num_reg_total = mysql_num_rows($result); ¿Estoy en lo correcto? Última edición por latin.developer; 12/10/2006 a las 16:23 |
| |||
He unido con éxitos mis SELECT mediante el uso de UNION (Muchas gracias Solecoza). Ahora mi problema está en que, no puedo hacer un ORDER BY a todo. Leí en un artículo que esto se puede hacer pero, mi tira el siguiente error: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in ... En mi servidor tengo el MySQL 4.0.25. ¿Será un problema de compatibilidad? A continuación mi QUERY a ver si le ven algo malo: (SELECT p.IDproduccion, p.titulo, p.IDcategoria, p.informacion, i.IDproduccion, i.IDartista, a.IDartista, a.Nombre FROM produccion p, interprete i, artista a WHERE (i.IDproduccion=p.IDproduccion AND a.IDartista=i.IDartista) AND (p.informacion like '%$p_search_g%' OR p.titulo like '%$p_search_g%' OR a.Nombre like '%$p_search_g%')) UNION (SELECT p.IDproduccion, p.titulo, p.IDcategoria, p.informacion, pda.IDproduccion, pda.IDproductor, pr.IDproductor, pr.productor FROM produccion p, producida pda, productor pr WHERE (pda.IDproduccion=p.IDproduccion AND pda.IDproductor=pr.IDproductor) AND (pr.productor like '%$p_search_g%')) UNION (SELECT p.IDproduccion, p.titulo, p.IDcategoria, p.informacion, cta.IDproduccion, cta.IDcompositor, c.IDcompositor, c.Apellido FROM produccion p, compuesta cta, compositor c WHERE (cta.IDproduccion=p.IDproduccion AND cta.IDcompositor=c.IDcompositor) AND (c.Apellido like '%$p_search_g%' OR c.Nombre like '%$p_search_g%')) ORDER BY p.IDproduccion ASC Por cierto, tampoco suprime las filas duplicadas. ¿Que podrá ser? ¡Muchas gracias! Última edición por latin.developer; 15/10/2006 a las 15:39 Razón: Falto información en el mensaje |
| ||||
El error de mysql_num_row segun parece es porque no le das el nombre de la consulta correcta. Y lo de las repeticiones, despues de el primer SELECT de cada consulta poné distinct. Poné como se llama la consulta donde almacena los datos, y tu llamada mysql_num_rows. |
| |||
Nada, me sigue dando el mismo error al ponerle el ORDER BY. Y probé poniendo un DISTINCT luego de cada SELECT y solo NO duplica los registros de cada SELECT (como era de suponerse). No entiendo porque no funcionan los UNION evitando la duplicacion. A continuación el código mas completo: $sql="(SELECT p.*, i.IDproduccion, i.IDartista, a.IDartista, a.Nombre FROM produccion p, interprete i, artista a WHERE (i.IDproduccion=p.IDproduccion AND a.IDartista=i.IDartista) AND (p.titulo like '%$p_search_g%' OR p.informacion like '%$p_search_g%' OR a.Nombre like '%$p_search_g%')) UNION (SELECT p.*, pda.IDproduccion, pda.IDproductor, pr.IDproductor, pr.productor FROM produccion p, producida pda, productor pr WHERE (pda.IDproduccion=p.IDproduccion AND pda.IDproductor=pr.IDproductor) AND (pr.productor like '%$p_search_g%')) UNION (SELECT p.*, cta.IDproduccion, cta.IDcompositor, c.IDcompositor, c.Apellido FROM produccion p, compuesta cta, compositor c WHERE (cta.IDproduccion=p.IDproduccion AND cta.IDcompositor=c.IDcompositor) AND (c.Apellido like '%$p_search_g%')) ORDER BY p.IDproduccion"; ?> <br /> <? $result = mysql_query($sql); $num_reg_total = mysql_num_rows($result); ?> |
| |||
Hola. He resuelto este asunto de la siguiente forma: Como no logré ordenar el UNION y nunca logré que el UNION no permitiera registros duplicados, resolví hacer una TABLA TEMPORAL y vacias el QUERY allí, entonces, esa TABLA es la que ordenaría. A continuación todo el código y espero que le sirva de ayuda en un futuro: $crear_tabla = " CREATE TEMPORARY TABLE `produccionTMP` ( `IDproduccion` mediumint(6) unsigned NOT NULL default '0', `titulo` varchar(150) NOT NULL default '', `lugar` varchar(150) NOT NULL default '', `fecha` varchar(50) NOT NULL default '', `deposito_legal` varchar(50) NOT NULL default '', `fuente` varchar(255) NOT NULL default '', `informacion` longtext, `IDcategoria` tinyint(3) unsigned NOT NULL default '0', `id_admin` int(11) default NULL, `isonido` varchar(255) default NULL, `productorart` varchar(255) default NULL, `contacto` varchar(255) default NULL, `genero` varchar(255) default NULL, PRIMARY KEY (`IDproduccion`), UNIQUE KEY `IDproduccion` (`IDproduccion`), KEY `IDproduccion_2` (`IDproduccion`) )"; mysql_query($crear_tabla); $sql_produccion="INSERT INTO produccionTMP SELECT p.* FROM produccion p WHERE p.titulo like '%$p_search_g%' OR p.informacion like '%$p_search_g%' UNION SELECT p.* FROM produccion p, interprete i, artista a WHERE i.IDproduccion=p.IDproduccion AND a.IDartista=i.IDartista AND a.Nombre like '%$p_search_g%' UNION SELECT p.* FROM produccion p, producida pda, productor pr WHERE (pda.IDproduccion=p.IDproduccion AND pda.IDproductor=pr.IDproductor) AND (pr.productor like '%$p_search_g%') UNION SELECT p.* FROM produccion p, compuesta cta, compositor c WHERE (cta.IDproduccion=p.IDproduccion AND cta.IDcompositor=c.IDcompositor) AND (c.Apellido like '%$p_search_g%' OR c.Nombre like '%$p_search_g%')"; mysql_query($sql_produccion); $sql = " SELECT * FROM produccionTMP ORDER BY IDproduccion"; Muchas gracias por sus constantes ayudas. (en especial a SOLECOZA) |