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

[SOLUCIONADO] Elegir que campo mostrar cuando usas Inner Join

Estas en el tema de Elegir que campo mostrar cuando usas Inner Join en el foro de Bases de Datos General en Foros del Web. Hola gente, tengo un problema quiero saber si es posible. Tengo esta consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT productos .*, categorias .* FROM ...
  #1 (permalink)  
Antiguo 21/09/2015, 08:23
 
Fecha de Ingreso: enero-2010
Mensajes: 400
Antigüedad: 14 años, 9 meses
Puntos: 6
Elegir que campo mostrar cuando usas Inner Join

Hola gente, tengo un problema quiero saber si es posible. Tengo esta consulta:
Código SQL:
Ver original
  1. SELECT productos.*, categorias.*
  2. FROM productos INNER JOIN categorias ON productos.categoria = categorias.id
  3. WHERE categoria = $cat
Cita:
Editado: Código de programacion no permitido en foros de BBDD.
Mi problema surge cuando quiero mostrar el campo ID del producto, me muestra el campo id de la categoria.

Lo estoy haciendo en PHP.

Espero su respuesta. gracias

Última edición por gnzsoloyo; 21/09/2015 a las 08:35
  #2 (permalink)  
Antiguo 21/09/2015, 08:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Elegir que campo mostrar cuando usas Inner Join

Tu problema sucede porque estás usando los mismos nombres para los campos de las dos tablas, lo que es una muy mala costumbre. Y encima, estás pidiendo (innecesariamente) por TODOS los campos de las dos tablas, sin importar como se llaman.
Como la base devuelve todo, y tu no le has puesto alias para identificarlos mejor, el lenguaje de programación no puede adivinar cual es el correcto.
Es conveniente que los campos ID de tablas diferentes NO SE LLAMEN DE LA MISMA FORMA. Lo usual es ponerles un prefijo o sufijo que permita una mejor identificación del campo.
En la práctica, lo conveniente es que jamás exista un campo entre dos tablas, cuyo nombre sea exactamente el mismo, a menos que ese campo sea PK en uno y FK en la otra (método para relacionar las FK de forma segura).

Hay dos soluciones posibles:

1) Indicas uno a uno los campos en el SELECT, poniendo alias a aquellos que puedan ser ambiguos, y usando esos alias para la aplicación.
2) Cambias los nombres de los campos de la tabla de modo que sean unocos para la base.

El primer caso sería por ejemplo:

Código SQL:
Ver original
  1. SELECT p.id producto_id, p.nombre producto_nombre, cat.id categ_id, cat.nombre categ_nombre
  2. FROM productos P INNER JOIN categorias cat ON p.categoria = cat.id
  3. WHERE cat.categoria = $cat

La segunda:

Cita:
PRODUCTOS(prod_id, prod_nombre. categ_id)
CATEGORIA (categ_id, categ_nombre, ...)
De esa forma nunca habrá campos ambiguos.

¿Se va entendiendo?

Posdata: Que lo hagas en PHP es irrelevante. Tendrías el mismo rpoblema en cualquier lenguaje...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 21/09/2015 a las 08:46
  #3 (permalink)  
Antiguo 21/09/2015, 09:25
 
Fecha de Ingreso: enero-2010
Mensajes: 400
Antigüedad: 14 años, 9 meses
Puntos: 6
Respuesta: Elegir que campo mostrar cuando usas Inner Join

Hola, gracias por tu pronta respuesta, utilice las 2 formas, ja.

Por un lado seleccione solamente los campos que necesito y no todos y por el otro le coloque alias al campo id y listo, simplifique todo.

Hay alguna diferencia de velocidad en la carga al seleccionar toda la tabla entera ? o es solo para evitar este tipo de problemas?
Muchas gracias
  #4 (permalink)  
Antiguo 21/09/2015, 09:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Elegir que campo mostrar cuando usas Inner Join

Hya diferencias, porque todo dato que obtienes, pero no usas, es un dato que ocupa espacio en el datagrama que se transmite por la red. Y mientras más grande sea el dato (por ejemplo campos VARCHAR o TEXT), peor se vuelve.
En BBDD recomendamso siempre que no se use el "*" para buscar datos, sino sólo se invoque los necesarios para la consulta. Usarlo tiene impactos nocivos no sólo en el enlace, sino también en el uso de BBDD compartidas porque esos datos usan espacio en el buffer de consultas, y eventualmente los servicios tercerizados de hosting pueden penalizarte por el exceso de uso de datos.
La tasa de datos/hora es parte de las metricas que miden la performance general de una base.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, elegir, join, 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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 22:25.