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

QUERY en multiples tablas

Estas en el tema de QUERY en multiples tablas en el foro de Mysql en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 12/10/2006, 09:15
 
Fecha de Ingreso: mayo-2005
Mensajes: 55
Antigüedad: 18 años, 11 meses
Puntos: 1
Pregunta QUERY en multiples tablas

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.
  #2 (permalink)  
Antiguo 12/10/2006, 13:09
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Si... solo colocas el SELECT, los campos a seleccionar pero con el nombre de tabla antes un punto y luego el campo, después del FROM colocas las TABLAS y en el WHERE colocas el campo a comparar pero poniendo primero el nombre de la tabla un punto y el nombre del campo.

Ejemplo:
TablaA: Campos VALORA, CA1
TablaB: Campos VALORB, CB1
TablaC: Campos VALORC, CC1

Sentencia armada:
Código PHP:
SELECT TablaA.VALORATablaB.VALORBTablaC.VALORC
FROM TablaA
TablaBTablaC
WHERE TablaA
.CA1 "variable" OR 
          
TablaB.CB1 "variable" OR
          
TablaC.CC1 "variable" 
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #3 (permalink)  
Antiguo 12/10/2006, 13:58
 
Fecha de Ingreso: mayo-2005
Mensajes: 55
Antigüedad: 18 años, 11 meses
Puntos: 1
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.
  #4 (permalink)  
Antiguo 12/10/2006, 14:17
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
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.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #5 (permalink)  
Antiguo 12/10/2006, 14:32
 
Fecha de Ingreso: mayo-2005
Mensajes: 55
Antigüedad: 18 años, 11 meses
Puntos: 1
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.
  #6 (permalink)  
Antiguo 12/10/2006, 15:33
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
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
  #7 (permalink)  
Antiguo 12/10/2006, 15:56
 
Fecha de Ingreso: mayo-2005
Mensajes: 55
Antigüedad: 18 años, 11 meses
Puntos: 1
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
  #8 (permalink)  
Antiguo 13/10/2006, 21:44
Avatar de solecoza  
Fecha de Ingreso: julio-2006
Mensajes: 126
Antigüedad: 17 años, 9 meses
Puntos: 0
Las podés unir usando UNION.
Select * from x where x

Union

Select * from x where x
  #9 (permalink)  
Antiguo 15/10/2006, 15:01
 
Fecha de Ingreso: mayo-2005
Mensajes: 55
Antigüedad: 18 años, 11 meses
Puntos: 1
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
  #10 (permalink)  
Antiguo 15/10/2006, 19:38
Avatar de solecoza  
Fecha de Ingreso: julio-2006
Mensajes: 126
Antigüedad: 17 años, 9 meses
Puntos: 0
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.
  #11 (permalink)  
Antiguo 15/10/2006, 20:52
 
Fecha de Ingreso: mayo-2005
Mensajes: 55
Antigüedad: 18 años, 11 meses
Puntos: 1
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);
?>
  #12 (permalink)  
Antiguo 15/10/2006, 22:59
 
Fecha de Ingreso: mayo-2005
Mensajes: 55
Antigüedad: 18 años, 11 meses
Puntos: 1
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)
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 11:04.