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

Select para 3 tablas.

Estas en el tema de Select para 3 tablas. en el foro de Mysql en Foros del Web. Sí, pero esto es solo el comienzo y ya verás los problemas. La velocidad ha mejorado, creo, por los índices, que eran necesarios. Probaremos una ...

  #31 (permalink)  
Antiguo 20/09/2012, 13:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Select para 3 tablas.

Sí, pero esto es solo el comienzo y ya verás los problemas. La velocidad ha mejorado, creo, por los índices, que eran necesarios. Probaremos una cosa tras otra, según nos digas qué quieres hacer luego, hasta que choquemos de frente con los problemas que ya te anticipó gnzsoloyo. Entonces entenderás todo lo que te quería decir nuestro moderador en su permalink #7 de este post.
  #32 (permalink)  
Antiguo 21/09/2012, 01:14
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Select para 3 tablas.

Buenos dias, estoy probando en web y no me funciona, sin embargo en el sitio local del ordenador va perfectamente.
A que puede ser debido?
  #33 (permalink)  
Antiguo 21/09/2012, 05:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Select para 3 tablas.

pueden ser muchas cosas que tendrás que probar y controlar.
Para empezar imagino que la conexión con la base funciona.
Creo que convendría debuguear cada paso, es decir, mostrar errores, hacer echo en PHP de la consulta, comprobar las variables pasadas, pero para eso debes pedir ayuda en el foro PHP.
  #34 (permalink)  
Antiguo 21/09/2012, 05:09
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Select para 3 tablas.

Ok, hago la consulta y luego seguimos.
Gracias.
  #35 (permalink)  
Antiguo 21/09/2012, 08:37
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Select para 3 tablas.

Ya me funciona bien en la web, podemos seguir con la consulta para filtrar mas campos como por ejemplo nombre y apellidos, poblacion y tambien añadir la tabla AP_USUARIOS para complicar el tema no?

Podemos hacer otro select aparte?
  #36 (permalink)  
Antiguo 21/09/2012, 08:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Select para 3 tablas.

Código MySQL:
Ver original
  1. U.nombre,  
  2. U.apellidos,  
  3. U.nu_usuario,  
  4. U.telefono,
  5.  FROM USUARIOS U
  6. WHERE CONCAT( nombre, ' ', apellidos ) LIKE '%{$vnombre}%' AND U.telefono LIKE '%{$vte}%';

Esto si buscas coincidencia de nombre y teléfono, pero ojo, en el foro PHP te enseñarán a controlar que si no se pasa la variable de nombre $vnombre, no se incluya esa parte de la consulta. Me refiero a esto: CONCAT( nombre, ' ', apellidos ) LIKE '%{$vnombre}%' AND

La siguiente consulta es si se incluye población. Eso obliga a hacer un INNER JOIN con la tabla de poblacion, pero ojo, seguimos exigiendo que se cumplan todos los valores de todos los parámetros pasados, y si buscas la poblacion de una persona que tenga dos direcciones en esa localidad, aparecerá dos veces esa persona, por lo que deberás decirnos qué querrías hacer con esos datos en ese momento.
Código MySQL:
Ver original
  1. U.nombre,  
  2. U.apellidos,  
  3. U.nu_usuario,  
  4.  U.telefono,
  5. D.poblacion
  6.  FROM usuarios U INNER JOIN dir_usuarios D
  7. ON U.num_usuario=D.num_usuario
  8. WHERE CONCAT( nombre, ' ', apellidos ) LIKE '%{$vnombre}%' AND U.telefono LIKE '%{$vte}%' AND poblacion LIKE '%{$vpoblacion}%'
  9. ;

Aquí es donde ya empezaría yo a preguntarme si debo usar índices fulltext sobre esos campos y que busquen sobre todos ellos. Pero por ahora dejaremos eso.

Última edición por jurena; 21/09/2012 a las 08:57
  #37 (permalink)  
Antiguo 21/09/2012, 10:06
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Select para 3 tablas.

Ok, vamos por el buen camino.Ahora como podemos hacer recoger en la siguiente pestaña los datos del aparato, con otro select?.


tabla ------> AP_USUARIOS

NUM_APARATO-----> FK
NUM_USUARIO
MODELO
MARCA
APARATO
COD_APARATO
NUM_SERIE
FECHA_COMPRA
  #38 (permalink)  
Antiguo 21/09/2012, 10:18
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Select para 3 tablas.

Código MySQL:
Ver original
  1. U.nombre,  
  2. U.apellidos,  
  3. U.nu_usuario,  
  4.  U.telefono,
  5. D.poblacion.
  6. au.num_aparato,
  7. au.aparato,
  8. au.modelo,
  9. au.marca,
  10. au.num_serie
  11.  FROM usuarios U INNER JOIN dir_usuarios D
  12. ON U.num_usuario=D.num_usuario INNER JOIN ap_usuarios au ON U.num_usuario = au.num_usuario
  13. WHERE CONCAT( nombre, ' ', apellidos ) LIKE '%{$vnombre}%' AND U.telefono LIKE '%{$vte}%' AND poblacion LIKE '%{$vpoblacion}%' AND au.modelo LIKE '%{$vmodelo}''
  14. ;

Solo he añadido el filtro por la variable modelo, y los campos que querría mostrar. Revisa los duplicados de usuario. Haz pruebas y verás que al buscar a veces te saca el mismo usuario varias veces... Ya empieza a devolver pocos resultados y no sé si es lo que buscas. Con programación controlas lo que envías para que la consulta se acomode a ello.
  #39 (permalink)  
Antiguo 21/09/2012, 12:03
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Select para 3 tablas.

A ver, se a quedado de esta forma porque habia algún error:

Código PHP:
Ver original
  1. SELECT U.nombre, U.apellidos, U.num_usuario, U.telefono, D.poblacion, au.num_aparato, au.aparato, au.modelo, au.marca, au.num_serie
  2. FROM usuarios U
  3. INNER JOIN dir_usuarios D ON U.num_usuario = D.num_usuario
  4. INNER JOIN ap_usuarios au ON U.num_usuario = au.num_usuario
  5. WHERE CONCAT( nombre, ' ', apellidos ) LIKE '%$vnm%' AND U.telefono LIKE '%$vte%' AND D.poblacion LIKE '%$vpo%'

En myadmin he metido un nº de telefono para buscar y me ha tardado unos 38 segundos en encontrarmelo y en la web directamente en el formulario no encuentra nada.
  #40 (permalink)  
Antiguo 21/09/2012, 12:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Select para 3 tablas.

¿Tienes indexados los campos en los que realizarás las búsquedas, por ej. los número de teléfono?
  #41 (permalink)  
Antiguo 21/09/2012, 15:10
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Select para 3 tablas.

Jurena, me funciona bien pero me duplica por 8 o 10 veces cada registro de usuarios y aparatos, pero no es en todos.
Creo que los que se duplican son los usuarios que tienen mas de un aparato en su domicilio porque los que tienen solo uno no se duplican.

Última edición por satjaen; 21/09/2012 a las 16:32
  #42 (permalink)  
Antiguo 22/09/2012, 05:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Select para 3 tablas.

¿Entiendes ahora lo que decía @gnzsoloyo en el permalink #7? A eso se refería. Si añades un GROUP BY U.num_usuario
verás lo que ocurre. Pruébalo. Te trae sólo un dato, pero pierdes otros, por ej., si buscas por el nombre sólo te mostrará una dirección, y un aparato de ese cliente, el primero. Lo mejor sería traerse sólo el identificador SELECT U.num_usuario y U.nombre, U.apellidos FROM... GROUP BY U.num_usuario
Luego montas el resultado con enlaces que permitirán pasar el num_usuario, pero también los otros criterios de búsqueda que pasas por GET. Eso permitiría lanzar búsquedas específicas sobre cada cliente y detalle del mismo. Luego haría consulta dependiendo del número de parámetros. Piensa que una búsqueda puede ofrecerte muchos resultados y otra uno o ninguno.
  #43 (permalink)  
Antiguo 25/09/2012, 10:22
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Select para 3 tablas.

Gracias, ahora ya no se duplican los usuarios, pero solo sale un aparato por usuario.
Que podemos hacer?
  #44 (permalink)  
Antiguo 25/09/2012, 10:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Select para 3 tablas.

Es mejor que se dupliquen los usuarios (eso no tiene por qué ser un problema), pues así conservarás los otros datos que sí son importantes. Dicho esto, creo que no es este el mejor lugar para responder a tu pregunta sobre qué hacer con esos datos. Hazla en el foro de programación. Hay varias formas de hacerlo. Allí te ayudarán. Aquí ya tienes las líneas de datos sacadas...
  #45 (permalink)  
Antiguo 25/09/2012, 11:23
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 8 meses
Puntos: 10
Respuesta: Select para 3 tablas.

Gracias, así lo hare.

Etiquetas: select
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 14:28.