[Php-avanzado] Producto cartesiano de dos tablas

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Jue Jul 16 02:31:59 ART 2009


Hola Favio,

El mié, 15-07-2009 a las 21:14 -0300, Favio Lazzarini escribió:
> Tengo una duda con el join.

> Tengo una tabla de productos con:

> Id
> articulo
> Id_marca
> Codigo
> Imagen
> Cantidad
> Iva
> estado


> Y la otra tabla es marcas con:
> 
> Id
> Marca
>  
> Cuando listo los productos obtengo solo el id de la marca.

	Es correcto, ya que en la tabla de productos tenés solo el ID.

> Yo quiero hacer que el id_marca remplazado por el nombre de la marca
> Como se busca en dos tablas?
> 
>  
> 
>             $consulta="SELECT p.id, p.art, p.cod, p.id_marca, p.img,
> p.cant, p.iva, p.est
>            FROM productos AS p
>             LEFT JOIN marcas AS a p.id_marca=a.id
>             WHERE p.id_marca=a.id;";

	Esta proyección no se ve mal, lo único que tendrías que agregarle es al
SELECT que también proyecte a.marca.
	El WHERE del final sobra porque la relación entre las tablas la estás
haciendo vía el LEFT JOIN: o usás uno o usás el otro, pero no los dos.

	Por otra parte, si es obligatorio que los productos tengan una marca,
no hace falta el LEFT JOIN y podrías más simplemente proyectar así los
datos:

SELECT p.id, p.art, p.cod, a.marca, p.img, p.cant, p.iva, p.est
FROM (productos AS p, marcas as a)
WHERE p.id_marca=a.id


> $consulta="SELECT * FROM (productos AS P, marcas AS M) LEFT JOIN
> productos ON P.id_marca=M.id WHERE M.id=P.id_marca AND
> M.id=P.id_marca;";

	Acá estás haciendo la relación 3 veces: en el LEFT JOIN y repetida en
el WHERE.


> Tambien la puse asi:
> 
>  
> 
> $consulta="SELECT P.id, P.cod, P.art, P.id_marca, P.imag, M.mar, M.id
> FROM (productos AS P, marcas AS M) LEFT JOIN productos ON
> P.id_marca=M.id WHERE M.id=P.id_marca AND M.id=P.id_marca;";

	Acá de vuelta está 3 veces...


> Si alguien me puede decir por que se produce el producto cartesiano.
> Solo hay dos productos y aparecen 4 

	No es corto de explicar por mail, pero básicamente proyectás la
relación (productos AS P, marcas AS M) bien acotada por el WHERE, pero
después a esa proyección le relacionás otra vez con productos, con lo
cual los productos están dos veces... y eso es lo que ves.
	No es el producto cartesiano sino los productos duplicados, pero como
tenés solo 2 y 2x2 = 2+2 te pareció que lo era.

	Miniregla informal: tener al menos 3 datos para testear las querys ;-)

> Si alguien me ppuede dar una mano
> Se agradece

	Por nada!

PD: si estas tablas son como supongo para NoMoreTax, no hay
requerimiento que indique la gestión de Marcas... 
PPD: qué es el "estado" que tiene el Producto?
PPPD: y el IVA? Es "si/no" o la tasa?


-- 
Leonardo Tadei
leonardot en pegasusnet.com.ar
http://blog.pegasusnet.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key



Más información sobre la lista de distribución Php-avanzado