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

Select a dos tablas.

Estas en el tema de Select a dos tablas. en el foro de Mysql en Foros del Web. Buenos dias, necesito por favor ayuda en una consulta. Tengo dos tablas llamadas usuarios y avisos . Con los mismos campos llamados name,telefonos,dni. Y lo ...
  #1 (permalink)  
Antiguo 16/01/2013, 06:05
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Select a dos tablas.

Buenos dias, necesito por favor ayuda en una consulta. Tengo dos tablas llamadas usuarios y avisos. Con los mismos campos llamados name,telefonos,dni. Y lo que quiero es hacer el SELECT para filtrar los datos por telefonos,dni,name. Pero claro por ejemplo el nº de teléfono 9000 existe en la tabla usuarios pero no existe en la tabla avisos o a la inversa. O tambien se puede dar el caso de que exista en las dos tablas.
He intentado así pero me salen muchos registros:
Código SQL:
Ver original
  1. SELECT U.telefonos,U.name,A.telefonos,A.name
  2. FROM usuarios U,avisos A
  3. WHERE U.telefonos='$vte' OR A.telefonos='$vte' ;

Donde $vte es el valor de telefonos.
Un saludo

Última edición por gnzsoloyo; 16/01/2013 a las 06:21
  #2 (permalink)  
Antiguo 16/01/2013, 06:10
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Select a dos tablas.

Si no he entendido mal, quieres filtrar en la tabla "usuarios", filtrar en la tabla "avisos" y juntar los resultados de ambas consultas.
Si es así, tendrías que darle un vistazo a Union.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 16/01/2013, 06:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Select a dos tablas.

Suponiendo que cada aviso pertenece a un usuario (lo cual sería una condición esperable si la base está bien diseñada), y la FK de usuario está en Avisos:
Código SQL:
Ver original
  1. SELECT U.telefonos,U.name,A.telefonos,A.name
  2. FROM usuarios U INNER JOIN avisos A U.user_id = A.user_id
  3. WHERE U.telefonos='$vte' OR A.telefonos='$vte' ;
Si esta condición no se cumple, entonces tienes un grave error de diseño...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 16/01/2013, 06:59
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por Malenko Ver Mensaje
Si no he entendido mal, quieres filtrar en la tabla "usuarios", filtrar en la tabla "avisos" y juntar los resultados de ambas consultas.
Si es así, tendrías que darle un vistazo a Union.
Gracias por contestar.

Puede ser:

Código MySQL:
Ver original
  1. (SELECT telefonos,name FROM usuarios WHERE telefonos='$vte')
  2. (SELECT telefonos,name FROM avisos WHERE telefonos='$vte'));

Última edición por gnzsoloyo; 16/01/2013 a las 07:28
  #5 (permalink)  
Antiguo 16/01/2013, 07:01
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Suponiendo que cada aviso pertenece a un usuario (lo cual sería una condición esperable si la base está bien diseñada), y la FK de usuario está en Avisos:
Código SQL:
Ver original
  1. SELECT U.telefonos,U.name,A.telefonos,A.name
  2. FROM usuarios U INNER JOIN avisos A U.user_id = A.user_id
  3. WHERE U.telefonos='$vte' OR A.telefonos='$vte' ;
Si esta condición no se cumple, entonces tienes un grave error de diseño...
Perdona gnzsoloyo, es que no habia visto tu respuesta.
Pruebo y te digo algo.
  #6 (permalink)  
Antiguo 16/01/2013, 07:07
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por satjaen Ver Mensaje
Perdona gnzsoloyo, es que no habia visto tu respuesta.
Pruebo y te digo algo.
gnzsoloyo, me da este error:

Código MySQL:
Ver original
  1. Error
  2.  
  3. consulta SQL: Documentación
  4.  
  5. SELECT U.telefonos, U.name, A.telefonos, A.name
  6. FROM usuarios U
  7. INNER JOIN avisos A U.user_id = A.user_id
  8. WHERE U.telefonos = '953000'
  9. OR A.telefonos = '953000'
  10. LIMIT 0 , 30
  11.  
  12. MySQL ha dicho: Documentación
  13. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'U.user_id = A.user_id
  14. WHERE U.telefonos='953000' OR A.telefonos='953000'
  15. ' at line 2
  #7 (permalink)  
Antiguo 16/01/2013, 07:12
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Select a dos tablas.

Diria que falta el "ON" de la Join:


Código MySQL:
Ver original
  1. SELECT U.telefonos, U.name, A.telefonos, A.name
  2. FROM usuarios U
  3. INNER JOIN avisos A ON U.user_id = A.user_id
  4. WHERE U.telefonos = '953000'
  5. OR A.telefonos = '953000'
  6. LIMIT 0 , 30
__________________
Aviso: No se resuelven dudas por MP!
  #8 (permalink)  
Antiguo 16/01/2013, 07:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Select a dos tablas.

Exacto.
Omisión por el apuro.
Te sugiero que consultes con el manual de referencia cuando intentes algo nuevo que no conoces, y verifiques lo que copias. Copy+Paste no es una buena práctica, porque puedes copiar errores ajenos de tipeo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 16/01/2013, 09:48
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Exacto.
Omisión por el apuro.
Te sugiero que consultes con el manual de referencia cuando intentes algo nuevo que no conoces, y verifiques lo que copias. Copy+Paste no es una buena práctica, porque puedes copiar errores ajenos de tipeo.
El problema es que las tablas no estan relacionadas entre si con un id.
  #10 (permalink)  
Antiguo 16/01/2013, 09:49
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Select a dos tablas.

Cita:
Iniciado por satjaen Ver Mensaje
El problema es que en las tablas no estan relacionadas entre si con un id.
En ese caso, has podido probar con el union?
__________________
Aviso: No se resuelven dudas por MP!
  #11 (permalink)  
Antiguo 16/01/2013, 09:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Select a dos tablas.

Entonces esa consulta es imposible. Estarías generando un producto cartesiano, lo que es un espanto.

Ahora bien, ¿cómo es posible que existan los avisos sin usuarios?
¿Quién pone esos avisos, entonces?
¿Qué vincula en ese caso ambas cosas?

Sin no hay relación entre ambas cosas, simplemente estás intentando mezclar caballos con manzanas para conseguir calamares...
Simplemente no tendría sentido.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 16/01/2013, 16:28
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por Malenko Ver Mensaje
En ese caso, has podido probar con el union?
Malenko, pruebo y te comento.
  #13 (permalink)  
Antiguo 16/01/2013, 16:38
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Entonces esa consulta es imposible. Estarías generando un producto cartesiano, lo que es un espanto.

Ahora bien, ¿cómo es posible que existan los avisos sin usuarios?
¿Quién pone esos avisos, entonces?
¿Qué vincula en ese caso ambas cosas?

Sin no hay relación entre ambas cosas, simplemente estás intentando mezclar caballos con manzanas para conseguir calamares...
Simplemente no tendría sentido.
gnzsoloyo, son dos tablas en las que existen datos de clientes. La que utilizo ahora mismo es la de avisos pero he podido recuperar otra que tenía que es la que se llama usuarios. Por eso lo que quiero es que al buscar el teléfono,nombre,dni etc del cliente si no existe en una tabla me la recupere de la otra.
  #14 (permalink)  
Antiguo 16/01/2013, 16:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Select a dos tablas.

Cita:
son dos tablas en las que existen datos de clientes. La que utilizo ahora mismo es la de avisos pero he podido recuperar otra que tenía que es la que se llama usuarios.
Eso es lo que de llama inconsistencia perniciosa, y es un defecto extremadamente grave en un modelo de datos.
No debe haber dos tablas con datos solapados en un sistema. Debes eliminar uno de los grupos de datos y consolidarlos en una sola tabla (o más, si hay que normalizar).
Además, si existe una entidad "Noticias", y las noticias son puestas por los "Usuarios" o "Clientes", entonces debe existir una relación con una de ellas.
Yendo un poco más lejos, debes definir si en el sistema puede haber usuarios que no sean clientes y clientes que no sean usuarios, o qué se entiende por cada uno de ellos.

Tengo la impresión de que tu modelo de datos tiene serios y muy graves problemas de diseño...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 16/01/2013, 16:49
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Eso es lo que de llama inconsistencia perniciosa, y es un defecto extremadamente grave en un modelo de datos.
No debe haber dos tablas con datos solapados en un sistema. Debes eliminar uno de los grupos de datos y consolidarlos en una sola tabla (o más, si hay que normalizar).
Además, si existe una entidad "Noticias", y las noticias son puestas por los "Usuarios" o "Clientes", entonces debe existir una relación con una de ellas.
Yendo un poco más lejos, debes definir si en el sistema puede haber usuarios que no sean clientes y clientes que no sean usuarios, o qué se entiende por cada uno de ellos.

Tengo la impresión de que tu modelo de datos tiene serios y muy graves problemas de diseño...
gnzsoloyo, no tengo ninguna tabla llamada clientes solo tengo la de avisos en la que meto toda la información del cliente.
  #16 (permalink)  
Antiguo 16/01/2013, 16:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Select a dos tablas.

Cita:
gnzsoloyo, no tengo ninguna tabla llamada clientes solo tengo la de avisos en la que meto toda la información del cliente.
Bueno, eso es un diseño bastante malo... Una Noticia y un Cliente son entidades completamente distintas, y en tu contexto o se multiplican los datos del cliente, o cada cliente sólo puede estar relacionado con una única noticia (porque si pones más de una noticia por cliente o viceversa, tienes problemas de normalización).

¿Has leído algo de los fundamentos del modelo Entidad-Relación y de las Bases de Datos Relacionales?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 16/01/2013, 17:07
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Bueno, eso es un diseño bastante malo... Una Noticia y un Cliente son entidades completamente distintas, y en tu contexto o se multiplican los datos del cliente, o cada cliente sólo puede estar relacionado con una única noticia (porque si pones más de una noticia por cliente o viceversa, tienes problemas de normalización).

¿Has leído algo de los fundamentos del modelo Entidad-Relación y de las Bases de Datos Relacionales?
Así si funciona, el nombre me sale bien pero el teléfono me sale muy raro \0\0\0\0\0\0:

telefonos name
953000\0\0\0\0\0\0 NARCISO PARRAS

Código MySQL:
Ver original
  1. (
  2. SELECT telefonos, name
  3. FROM usuarios
  4. WHERE telefonos = '953000'
  5. )
  6.  
  7. SELECT telefonos, name
  8. FROM avisos
  9. WHERE telefonos = '953000'
  10. )
  #18 (permalink)  
Antiguo 17/01/2013, 03:06
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Parece que la UNION funciona. He filtrado por telefonos con $vte ahora quiero añadir el name y ademas con condiciones de campos vacios.

Estoy probando pero tengo errores:

Código MySQL:
Ver original
  1. SELECT telefonos,name,id_aviso FROM usuarios WHERE telefonos='$vte'
  2. SELECT telefonos,name,id_aviso FROM avisos WHERE telefonos='$vte';

Mejor así?

Código MySQL:
Ver original
  1. SELECT telefonos,name,id_aviso FROM usuarios WHERE telefonos='$vte'
  2. SELECT telefonos,name,id_aviso FROM avisos WHERE telefonos='$vte';

Última edición por gnzsoloyo; 17/01/2013 a las 03:22 Razón: Código de Programacion no permitido en los foros de Base de Datos.
  #19 (permalink)  
Antiguo 19/01/2013, 11:29
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por satjaen Ver Mensaje
Así si funciona, el nombre me sale bien pero el teléfono me sale muy raro \0\0\0\0\0\0:

telefonos name
953000\0\0\0\0\0\0 NARCISO PARRAS

Código MySQL:
Ver original
  1. (
  2. SELECT telefonos, name
  3. FROM usuarios
  4. WHERE telefonos = '953000'
  5. )
  6.  
  7. SELECT telefonos, name
  8. FROM avisos
  9. WHERE telefonos = '953000'
  10. )
Por favor, hace unos días hice esta consulta y no he tenido respuesta.
Al recuperar los datos de la BD de un campo llamado telefonos me lo recupera con unos simbolos que no se que significan:

telefonos
953000������
  #20 (permalink)  
Antiguo 19/01/2013, 12:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Select a dos tablas.

Habría que ver el contexto. Puede ser error de programación, sea en los INSERT o en el SELECT.
Tiene toda la impresión de ser un problema de charset.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #21 (permalink)  
Antiguo 19/01/2013, 13:19
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Select a dos tablas.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Habría que ver el contexto. Puede ser error de programación, sea en los INSERT o en el SELECT.
Tiene toda la impresión de ser un problema de charset.
Gracias gnzsoloyo, ya funciona. Efectivamente era cambiar el tipo a (int).
UN SALUDO

Etiquetas: registros, select, sql, tabla, campos
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 20:15.