Comparar Tablas MySQL (Except - minus)

Tengo dos tablas (Marcas Actuales y Marcas Posibles) y deseo crear una tercera tabla que sea Marcas NO escogidas.

Características de las tablas

1. Tienen una llave primaria compuesta por dos campos (Producto, Marca)

2. La tabla Marca Actuales siempre va ser mayor o igual a la Marca Posibles.

A continuación algunas tullas de las tablas:

Marcas Actuales

Producto                   Marca

Excavadora              Caterpillar

Excavadora              Hitachi

Motoniveladora      Hitachi

Motoniveladora      Komatsu

Marcas Posibles

Producto                   Marca

Excavadora              Caterpillar

Excavadora              Hitachi

Excavadora              Komatsu

Motoniveladora Caterpillar

Motoniveladora Hitachi

Motoniveladora Komatsu

La tercera tabla que deseo crear es que de acuerdo a los anteriores datos sería:

Marcas NO escogidas

Producto                   Marca

Excavadora              Komatsu

Motoniveladora Caterpillar

He intentado con las siguientes consultas:

CREATE VIEW MarcasNOescogidas AS
SELECT
MarcasPosibles. Producto AS Producto,
MarcasPosibles. Marca AS Marca
FROM
MarcasPosibles
LEFT JOIN
MarcasActuales ON MarcasPosibles.Producto = MarcasActuales.Producto
WHERE
MarcasActuales.Producto is NULL 

Sin embargo el resultado no es este.

1 respuesta

Respuesta

Pues, ¿de las dos tablas que tienes como sabes cuales ya escojiste? Podrias por favor, si aun deseas ayuda, ¿barajear las cartas con mas calma?

Buenos días Angel

Gracias por la intención de ayudarme, a continuación te explicare con más detalle el problema:

Tengo las siguientes tablas:

1. Producto (idProducto, Producto)

2. Marca (idMarca, Marca)

3. MarcaXProducto (idMarca, idProducto)

En la Tabla Producto se encuentra el nombre y otras características de los productos. Por ejemplo: Filtro de Combustible.

En la Tabla Mara se encuentran los nombres de las diferentes marcas que existen. Por ejemplo: Donaldson, Bosch, Baldwin.

La tercera tabla de MarcaXProducto: es la resultante de una relación muchos a muchos entre producto y marca; en esta tabla se registran las marcas de cada uno de los productos, por ejemplo. Filtro de Combustible - Marca Donaldson.

Ahora, para conocer las marcas de un producto específico realizo la siguiente consulta:

SELECT 

 MarcaXProducto.idMarca As idMarca,

 Marca.Marca AS idMarca

FROM

 MarcaXProducto

         LEFT JOIN

 Marca ON Marca.idMarca = MarcaXProducto

WHERE

 idProducto = "Producto específico"

Mi duda es que no sé como sacar una consulta de las marcas que no se han seleccionado para este producto "Producto específico".

En el ejemplo del filtro que estoy manejando sería:

Consulta de Marcas Actuales:  Donaldson

Consulta de Marcas Posibles: Bosch, Baldwin.

De antemano muchas gracias por tu tiempo y ayuda.

Cordialmente,

Jorge

A ver si te entendí Jorge la tabla marca por producto es la que tiene los elementos que se han seleccionado, verdad... entonces tomando que me das una afirmación algo similar seria así:

(Por favor corrígeme si ando mal)

######## hice estas tablas de ejemplo ######

CREATE TABLE `tblmarcasactuales` (
`autono` INT(11) NOT NULL AUTO_INCREMENT,
`idMarca` VARCHAR(50) NULL DEFAULT '0' COLLATE 'utf8_spanish_ci',
`Marca` VARCHAR(50) NULL DEFAULT '0' COLLATE 'utf8_spanish_ci',
`Producto` VARCHAR(50) NULL DEFAULT '0' COLLATE 'utf8_spanish_ci',
PRIMARY KEY (`autono`)
)
COMMENT='Marcas que han sido utilizadas'
COLLATE='utf8_spanish_ci'
ENGINE=MyISAM
AUTO_INCREMENT=10
;

=======================

CREATE TABLE `tblmarcas` (
`autono` INT(11) NOT NULL AUTO_INCREMENT,
`idMarca` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_spanish_ci',
`Marca` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_spanish_ci',
PRIMARY KEY (`autono`)
)
COLLATE='utf8_spanish_ci'
ENGINE=MyISAM
AUTO_INCREMENT=6
;

=======================================

CREATE TABLE `tblproductos` (
`autono` INT(11) NOT NULL AUTO_INCREMENT,
`idMarca` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_spanish_ci',
`Producto` VARCHAR(150) NULL DEFAULT NULL COLLATE 'utf8_spanish_ci',
PRIMARY KEY (`autono`)
)
COLLATE='utf8_spanish_ci'
ENGINE=MyISAM
AUTO_INCREMENT=6
;

================ Despues las llene con datos

insert into tblmarcasactuales (idmarca, marca, producto) values ('HIT','HITACHI','Televisor de 20 pulgadas');
insert into tblmarcasactuales (idmarca, marca, producto) values ('HIT','HITACHI','Televisor de 19 pulgadas');
insert into tblmarcasactuales (idmarca, marca, producto) values ('MOT','MOTOROLA','Radio de onda corta 2500 MHz');
insert into tblmarcasactuales (idmarca, marca, producto) values ('NOK','NOKIA','telefono celular de gama alta');

insert into tblmarcas (idmarca, marca) values ('HIT','HITACHI');
insert into tblmarcas (idmarca, marca) values ('HIT','HITACHI');
insert into tblmarcas (idmarca, marca) values ('HIT','HITACHI');
insert into tblmarcas (idmarca, marca) values ('MOT','MOTOROLA');
insert into tblmarcas (idmarca, marca) values ('NOK','NOKIA');

insert into tblproductos (idmarca, producto) values ('HIT','Televisor de 20 pulgadas');
insert into tblproductos (idmarca, producto) values ('HIT','Televisor de 19 pulgadas');
insert into tblproductos (idmarca, producto) values ('HIT','Disco Duro 500Gigas 7200 revoluciones');
insert into tblproductos (idmarca, producto) values ('MOT','Radio de onda corta 2500 MHz');
insert into tblproductos (idmarca, producto) values ('NOK','telefono celular de gama alta');

================== Y finalmente una consulta sencilla para ver que elementos no estan listados en la tblmarcasactuales ( que es donde se registran las "compras") 

drop view if exists productosNoElegidos;

create view productosNoElegidos as

select
prod.*
from tblproductos as prod
where concat(idMarca,producto) not in (
select concat(idMarca,producto) from tblmarcasactuales as act
)

Ojala que sea así lo que necesitas, seguimos en contacto Jorge.. suerte animo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas