MySQL - LEFT JOIN nulos y fila a columna

 
Vista:
sin imagen de perfil
Val: 5
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

LEFT JOIN nulos y fila a columna

Publicado por Hugo (3 intervenciones) el 25/04/2020 19:00:26
Tengo tres tablas
producto: productos
Codigo: cada producto puede tener distintos tipos de código: barra, fabrica, interno
ProductoCodigo es la que relaciona un producto con su código. Un producto puede tener 0, 1.. n códigos (como máximo uno solo por tipo (tabla código) n es la cantidad de registros de tabla código)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
CREATE TABLE producto
(
	prod_id integer, prod_nombre nvarchar(50),
	PRIMARY KEY (prod_id)
    );
 
INSERT INTO PRODUCTO (prod_id,prod_nombre)
	VALUES (1,'Aceite'), (2,'Arroz'), (3,'Harina')
 
 
CREATE TABLE codigo
(
	cod_id integer, cod_nombre nvarchar(50),
	PRIMARY KEY (cod_id)
);
 
INSERT INTO CODIGO (cod_id,cod_nombre)
	VALUES (1,'CodBarra'), (2,'CodFabrica'), (3,'CodInterno')
 
 
 
CREATE TABLE CODPROD
(
	prod_id integer, cod_id integer, codprod_Valor nvarchar(50),
	PRIMARY KEY (prod_id,cod_id),
	FOREIGN KEY (prod_id) REFERENCES producto(prod_id),
	FOREIGN KEY (cod_id) REFERENCES codigo(cod_id)
);
 
 
INSERT INTO CODPROD (prod_id,cod_id,codprod_valor)
	VALUES (1,1,'AAAA'), (1,2,'0000'), (1,3,'CINT01'),
    		(2,1,'BBBB'),
    		(2,3,'3333')
 
 
 
SELECT p.prod_id, p.prod_nombre,
  if(c.cod_id = 1, codprod_valor, '') AS Codigo1,
  if(c.cod_id = 2, codprod_valor, '') AS Codigo2,
  if(c.cod_id = 3, codprod_valor, '') AS Codigo3
FROM producto p
LEFT JOIN codprod cp
	ON p.prod_id=cp.prod_id
INNER JOIN codigo c
	ON cp.cod_id=c.cod_id

Con estos datos y mi consulta obtengo:
1
2
3
4
5
6
prod_id		prod_nombre	Codigo1	Codigo2	Codigo3
1			Aceite		AAAA	""		""
1			Aceite		""		0000		""
1			Aceite		""		""		CINT01
2			Arroz		BBBB	""		""
2			Arroz		""		""		3333

y me interesa obtener
1
2
3
4
prod_id		prod_nombre	Codigo1	Codigo2	Codigo3
1			Aceite		AAAA	0000		CINT01
2			Arroz		BBBB	3333		""
3			Harina		""		""		""

Desde ya muchas gracias a cualquier ayuda o punta que me tiren para resolver mi problema
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Francisco
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

LEFT JOIN nulos y fila a columna

Publicado por Francisco (73 intervenciones) el 27/04/2020 15:37:45
Hola

Intenta de esta manera

1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    p.prod_id,
    p.prod_nombre,
    MAX(IF(c.cod_id = 1, codprod_valor, '')) AS Codigo1,
    MAX(IF(c.cod_id = 2, codprod_valor, '')) AS Codigo2,
    MAX(IF(c.cod_id = 3, codprod_valor, '')) AS Codigo3
FROM producto p
LEFT JOIN codprod cp
	ON p.prod_id=cp.prod_id
INNER JOIN codigo c
	ON cp.cod_id=c.cod_id
GROUP BY 1,2

o con esta otra

1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    p.prod_id,
    p.prod_nombre,
    MAX(IF(c.cod_id = 1, codprod_valor, '')) AS Codigo1,
    MAX(IF(c.cod_id = 2, codprod_valor, '')) AS Codigo2,
    MAX(IF(c.cod_id = 3, codprod_valor, '')) AS Codigo3
FROM producto p
LEFT JOIN codprod cp
	ON p.prod_id=cp.prod_id
LEFT JOIN codigo c
	ON cp.cod_id=c.cod_id
GROUP BY 1,2

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 5
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

LEFT JOIN nulos y fila a columna

Publicado por Hugo (3 intervenciones) el 27/04/2020 19:16:55
Gracias Francisco, me salvaste el día.
Sos un capo, mira que le estaba dando vueltas a la query.
Viendo rápido no entiendo porque usan MAX, siempre la use para otra cosa.
Bueno, mil gracias mil y ya marque la respuesta.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar