Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/09/2015, 08:40
Avatar de gnzsoloyo
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: 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