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

Cómo imprimir consulta con JOIN sin repetir clave foránea?

Estas en el tema de Cómo imprimir consulta con JOIN sin repetir clave foránea? en el foro de Mysql en Foros del Web. Muchachos, tengo una duda la cual busqué en google pero no pillé nada excepto post con más cosas dentro de la consulta que terminaron por ...
  #1 (permalink)  
Antiguo 06/10/2010, 17:08
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Cómo imprimir consulta con JOIN sin repetir clave foránea?

Muchachos, tengo una duda la cual busqué en google pero no pillé nada excepto post con más cosas dentro de la consulta que terminaron por confundirme.

Les explico mi problema:
Tengo 2 tablas que están relacionadas por la clave foránea email, pongamos estas tablas como ejemplo:

TABLA 1: Persona
Nombre, Apellido, EMail
clave primaria(EMail)

TABLA 2: Empresa
EMail, Empresa, Ciudad
clave primaria(EMail)

En donde la clave foránea es EMail.

Ahora para imprimir los resultados uso la siguiente consulta:
"SELECT * FROM Persona JOIN Empresa ON Persona.Email = Empresa.EMail;"

Pero esto me incluye en el Array devuelvo por mysql_fetch_assoc() 2 veces los registros del campo EMail (consecuencia de ser clave foránea)

Ahora mi pregunta es, ¿Cómo puedo hacer para que no se repitan los valores de este campo y lo muestre 1 sola vez sin hacer esto:

"SELECT Persona.Nombre,
Persona.Apellido,
Persona.EMail,
Empresa.Empresa,
Empresa.Ciudad
FROM Persona JOIN Empresa ON Persona.EMail = Empresa.EMail;" ?

...ya que mi tabla real tiene muchos más campos.

Espero que me puedan ayudar, muchas gracias :)

Última edición por de-troit; 06/10/2010 a las 17:26
  #2 (permalink)  
Antiguo 07/10/2010, 07:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 4 meses
Puntos: 574
Respuesta: Cómo imprimir consulta con JOIN sin repetir clave foránea?

Código SQL:
Ver original
  1. SELECT Persona.*,
  2. Empresa.Empresa,
  3. Empresa.Ciudad
  4. FROM Persona JOIN Empresa ON Persona.EMail = Empresa.EMail;

Access aguanta esto... todos los campos de la tabla Persona y los que se especifican de la otra tabla...

No estoy seguro que mysql permita esta sintaxis, no lo tengo aquí para intentarlo...

Dime si te funciono. Si no creo que no tendrás mas remedio que incluir la lista de campos.

Quim
  #3 (permalink)  
Antiguo 07/10/2010, 08:45
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Cómo imprimir consulta con JOIN sin repetir clave foránea?

Sí Quimfv, lo soporta :D, pero aún así me queda larga la consulta y la idea es ahorrar bits. Actualmente (para mis tablas reales) me queda esto:

Código SQL:
Ver original
  1. "SELECT
  2.     inscripcionesPersona.*,
  3.     inscripcionesEmpresa.empresa,
  4.     inscripcionesEmpresa.actividad,
  5.     inscripcionesEmpresa.telefono_empresa,
  6.     inscripcionesEmpresa.fax,
  7.     inscripcionesEmpresa.web,
  8.     inscripcionesEmpresa.direccion,
  9.     inscripcionesEmpresa.ciudad,
  10.     inscripcionesEmpresa.comuna
  11. FROM inscripcionesPersona JOIN inscripcionesEmpresa ON
  12. inscripcionesPersona.email = inscripcionesEmpresa.email;"

Ojalá alguien sepa alguna otra manera para hacerlo más corto, muchas gracias por tu ayuda Quimfv, esto ya me ayuda mucho. Saludos!
  #4 (permalink)  
Antiguo 08/10/2010, 04:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 4 meses
Puntos: 574
Respuesta: Cómo imprimir consulta con JOIN sin repetir clave foránea?

Creo que el ahorro que buscas no justifica el tiempo invertido.

Quim
  #5 (permalink)  
Antiguo 08/10/2010, 06:08
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, 7 meses
Puntos: 2658
Respuesta: Cómo imprimir consulta con JOIN sin repetir clave foránea?

Cita:
Ahora mi pregunta es, ¿Cómo puedo hacer para que no se repitan los valores de este campo y lo muestre 1 sola vez sin hacer esto:

"SELECT Persona.Nombre,
Persona.Apellido,
Persona.EMail,
Empresa.Empresa,
Empresa.Ciudad
FROM Persona JOIN Empresa ON Persona.EMail = Empresa.EMail;" ?
¿Tu problema es entonces que te pone dos veces el campo`email`?

Sólo existen dos formas de evitarlo; la primera es la que ya te dijeron, invocar los campos específicamente (cosa que es una muy buena práctica porque evitas traer datos que no usas); la otra es el USING.
La cláusula USING se usa para establecer qué campos serán usados en un JOIN para relacionar dos tablas. Tiene como requisitos:
1) Los campos deben existir en ambas tablas.
2) Los campos deben poseer exactamente el mismo nombre en ambas tablas.

En tu caso sería:
Código MySQL:
Ver original
  1. FROM Persona INNER JOIN Empresa USING(Email );
Como USING hace un pivoteo sobre una columna, solamente muestra una, nada más. Es funcional con INNER, LEFT y RIGHT JOIN, y en esencia es estadísticamente más rápido que el ON, a pesar de que el parseo en una VIEW los traduce como iguales.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 09/10/2010, 10:21
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Cómo imprimir consulta con JOIN sin repetir clave foránea?

Gnzsoloyo, funciona perfectamente :D muchas gracias! Es la solución que buscaba.
En realidad soy bastante novato en BD y no he entendido la siguiente cita: "a pesar de que el parseo en una VIEW los traduce como iguales."

Qué es una View?

Cuando explicas que 'pivotea' una columna es similar a hallar pivotes en una matriz de orden mxn en Álgebra Lineal?

Saludos y disculpa si mis preguntas no son acertadas al tema.

Muchas gracias a todos!

Última edición por de-troit; 09/10/2010 a las 10:30
  #7 (permalink)  
Antiguo 09/10/2010, 10: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, 7 meses
Puntos: 2658
Respuesta: Cómo imprimir consulta con JOIN sin repetir clave foránea?

una VIEW es una vista. Es un objeto de base de datos que consiste en una sentencia SELECT precompilada y almacenada en la base de datos con un nombre determinado, la cual actúa como si fuese una tabla, pero que no tiene existencia real, y por tanto tampoco contiene registros.
Se usan para simplificar consultas repetitivas, o bien para evitar (por cuestiones de seguridad) que los usuarios accedan a las tablas de datos en forma directa.
Las vistas permiten definir una forma estandarizada de acceder a los datos de una o más tablas al mismo tiempo, de modo de no tener que escribir toda la sentencia cada vez, ya que la sentencia se almacena en la base.
Cita:
Cuando explicas que 'pivotea' una columna es similar a hallar pivotes en una matriz de orden mxn en Álgebra Lineal?
No exactamente. En el caso de SQL, el pivot es una columna que te permite crear un enlace entre dos o más tablas de datos y en el cual se realiza un matching 1:1 entre los valores que en ese campo existe en ambas. En el caso ´de MySQL, utilizar USING permite que sólo aparezca una columna, pero si, por ejemplo, usases la sentencia con el INNER JOIN para crear una vista, verías que el parser de MySQL traduce la sentencia convirtiendo el USING en un ON, agrega los dos campos, pero en el SELECT solamente le asigna ese campo a una de las tablas, con lo que en realidad se almacena un modelo más parecido al que te aconsejron.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 10/10/2010, 14:30
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Cómo imprimir consulta con JOIN sin repetir clave foránea?

Ahí me queda más claro, ya que en realidad soy novato, todos estos conceptos son nuevos para mi. Muchas gracias por ayudar, saludos! :)

Etiquetas: clave, join, repetir
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 12:03.